python—简单数据抓取五(如何让京东商品页显示60条数据、利用软件驱动实现超级鹰用户自动登录、利用iframe元素自动打开qq空间密码登录页面)
学习内容:
京东显示商品信息的页面,会首先显示前30个商品数据(page=1的数据),利用ajax奇数替换出后30个商品数据(page=2的数据)
1、改变url的方式抓取到一整页60个京东商品(即page=1,和page=2)的信息
2、请求一个奇数页面(page=1)之后,紧接着的偶数页面(page=2)的链接在奇数链接的基础上加上后30个商品的编号,就能显示60个商品信息
3、利用自动化软件获取到京东页面一整页(即page=1,和page=2)60个商品信息
4、自动输入用户信息登录超级鹰网站
5、利用iframe元素,自动打开qq空间密码登录页面
1、改变url的放式抓取到一整页(即page=1,和page=2)的信息
import requests
import re
import pymysql
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
connectes = pymysql.connect(database='zhuaqu', user='root', password='1234', host='127.0.0.1', charset='utf8')
cursor = connectes.cursor()
for i in range(3, 5):
# 将i转化为字符串
j = str(i)
a = 'https://search.jd.com/Search?keyword=大地瓜&qrst=1&stock=1&page=P&s=57&click=0'
# 用sub将i的值替换到page=P处
b = re.sub('P', j, a)
source = requests.get(b, headers=headers).text
base = etree.HTML(source).xpath('// *[ @ id = "J_goodsList"] / ul / li')
for i in base:
price = i.xpath('div / div[2] / strong/i/text()')
goods_name = i.xpath(' div / div[3] / a / em/text()')
dian = i.xpath('div / div[5] / span / a/text()')
# 将数据存入数据库
sql = 'insert into goods(price, goods_name, goods_dian ) value ("{}", "{}", "{}")'.format(price, goods_name, dian)
# 用ping命令在每次传输之前测试与数据库的连通性
connectes.ping(reconnect=True)
cursor.execute(sql)
connectes.commit()
connectes.close()
2、请求一个奇数页面(page=1)之后,紧接着的偶数页面(page=2)的链接在奇数链接的基础上加上后30个商品的编号,就能显示60个商品信息
import requests
import re
from lxml import etree
# header头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
'referer': 'https://search.jd.com/Search?keyword=%E5%A4%A7%E5%9C%B0%E7%93%9C&qrst=1&wq=%E5%A4%A7%E5%9C%B0%E7%93%9C&stock=1&page=3&s=56&click=0'
}
# 请求奇数页面page为3的网页代码
source = requests.get('https://search.jd.com/Search?keyword=%E5%A4%A7%E5%9C%B0%E7%93%9C&qrst=1&wq=%E5%A4%A7%E5%9C%B0%E7%93%9C&stock=1&page=3&s=56&click=0', headers=headers).text
# 用正则在数页面的接口中匹配出后三十个商品的编码
demo = re.compile("wids:'(.*?)'")
lists = demo.findall(source)
# 将不匹配出的编码加到上一个奇数链接后面,组成偶数页面的链接
source1 = requests.get('https://search.jd.com/Search?keyword=%E5%A4%A7%E5%9C%B0%E7%93%9C&qrst=1&wq=%E5%A4%A7%E5%9C%B0%E7%93%9C&stock=1&page=3&s=56&click=0'+ lists[0], headers=headers).text
# 分别用xpath匹配出商品的价格
price = etree.HTML(source).xpath('//*[@id="J_goodsList"]/ul/li/div/div[2]/strong/i/text()')
price1 = etree.HTML(source1).xpath('//*[@id="J_goodsList"]/ul/li/div/div[2]/strong/i/text()')
# 最后打印上下页即京东页面一整页的60个商品的价格
print(price)
print(price1)
3、利用自动化软件获取到京东页面一整页(即page=1,和page=2)60个商品信息,以及自动输入用户信息登录超级鹰网站
引入from selenium import webdriver包,没有selenium就下载到python
谷歌驱动中心下载chromedriver.exe驱动软件
该环境自动化软件可以打开一个浏览器,并获得页面的源码
1、一次性生成京东网页ajax替换后的页面即60个商品的全部数据
import re
# 延迟使用的包
import time
from lxml import etree
# 引入使用该驱动的包
from selenium import webdriver
# 找到本地驱动软件所在位置并启动该驱动软件
dr = webdriver.Chrome('F:\pycharm\anicod\chromedriver.exe')
# 利用该驱动软件打开京东的商品页面
dr.get('https://search.jd.com/Search?keyword=%E5%A4%A7%E5%9C%B0%E7%93%9C&qrst=1&wq=%E5%A4%A7%E5%9C%B0%E7%93%9C&stock=1&page=3&s=56&click=0')
# 将页面全部显示,即展示60个商品的页面(完成ajax页面替换后的整个页面)
dr.maximize_window()
# 用js代码模拟滑动网页滑块,将页面滑到最底部
js = "var q=document.documentElement.scrollTop=10000"
# 执行该js代码
dr.execute_script(js)
# 延迟2s
time.sleep(2)
# 获取驱动打开页面的源码
source = dr.page_source
# 在源码中用xpath匹配出需要的价格信息
price1 = etree.HTML(source).xpath('//li/div/div[2]/strong/i/text()')
# 打印并展示商品价格信息,还有该页商品总数
print(len(price1), price1)
4、自动输入用户信息登录超级鹰网站
import requests
import re
import time
from lxml import etree
# 引入使用该驱动的包
from selenium import webdriver
# 引入超级鹰的包
from chaojiying import Chaojiying_Client
# 引入图片处理的包
from PIL import Image
# 找到本地驱动软件所在位置并抵用该驱动软件
dr = webdriver.Chrome('F:\pycharm\anicod\chromedriver.exe')
# 打开超级鹰登录页面
dr.get('https://www.chaojiying.com/user/login/')
# 获取页面的最大化
dr.maximize_window()
# 获取页面的尺寸
window_size = dr.get_window_size()
# 将显示页面的宽和高分别赋予width和height(后面会获取验证码图片,并将验证码图片的宽和高分别赋给width和height)
width, height = window_size['width'], window_size['height']
# 延迟2s
time.sleep(2)
# 截取页面的全屏取名bdbutton.png并保存到本地地址
dr.save_screenshot('F:\pycharm\lx\chaojiying\bdbutton.png')
# 利用驱动找到用户名的输入框,先清空框里的信息
dr.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').clear()
# 利用驱动找到用户名的输入框,然后填入用户名信息send_keys包含的内容
dr.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys('17158232693')
# 利用驱动找到密码的输入框,先清空框里的信息
dr.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
# 利用驱动找到密码的输入框,然后填入密码信息send_keys包含的内容
dr.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys('yytax245.')
# 获取验证码图片的链接
element = dr.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')
# 定位验证码的左边到屏幕最左边的距离
left = element.location['x']
# 定位验证码的上边到屏幕最上面边的距离
top = element.location['y']
# 定位验证码的左边加上验证码的宽度就是验证码的右边到屏幕最左边的距离
right = left + element.size['width']
# 定位验证码的下边加上验证码的高度就是验证码的下边到屏幕最上边的距离
bottom = top + element.size['height']
# 打开刚才保存的最大尺寸屏幕的截屏
im = Image.open('F:\pycharm\lx\chaojiying\bdbutton.png')
# 对截屏按上面给出的left、top、right、bottom进行裁剪得到验证码图片
im = im.crop((left, top, right, bottom))
# 将验证码图片保存为a.png,方便超级鹰进行验证码扫码识别
im.save('F:\pycharm\lx\chaojiying\a.png')
chaojiying = Chaojiying_Client('912200') # 用户中心>>软件ID 生成一个替换 96001
im = open('F:\pycharm\lx\chaojiying\a.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
data = chaojiying.PostPic(im, 1902)
print(data)
# 利用驱动找到验证码的输入框,然后填入超级鹰识别到的验证码数据pic_str
dr.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(data['pic_str'])
# 点击登录进行超级鹰用户登录
dr.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()
from selenium import webdriver
# 引入智能延迟的包
from selenium.webdriver.support.ui import WebDriverWait
import time
dr = webdriver.Chrome('F:\pycharm\anicod\chromedriver.exe')
dr.get('https://qzone.qq.com/')
dr.maximize_window()
# 首先找到iframe元素以便打开密码登录页面
iframe = dr.find_element_by_tag_name('iframe')
# 选择iframe元素
dr.switch_to.frame(iframe)
time.sleep(1)
# 智能延迟等待密码登录页面打开
WebDriverWait(dr, 10).until(lambda the_driver:
the_driver.find_element_by_xpath('//*[@id="switcher_plogin"]').is_displayed())
# xpath获取到密码登录摁钮并点击
dr.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
# xpath获取到用户名输入框并输入用户名
dr.find_element_by_xpath('//*[@id="u"]').send_keys('qq号')
# xpath获取到密码输入框并输入密码
dr.find_element_by_id("p").send_keys("qq密码")
# 点击登录
dr.find_element_by_id("login_button").click()