爬虫第四篇
Ajax的动态加载处理方法
对于json格式的相应,如果页面是ajax动态加载的,可用通过设置它的limit(每次页面加载的数量)巧妙的避开,
也可以通过自动化工具selenium来处理ajax的动态加载
import requests
import json
import pymysql
class DoubanSpider:
def __init__(self):
self.url = "https://movie.douban.com/j/chart/top_list?"
self.headers = {"User-Agent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"}
self.db = pymysql.connect("192.168.56.129","lion","123456", "spiderdb",charset="utf8")
self.cursor = self.db.cursor()
# 获取页面
def getPage(self,params):
res = requests.get(self.url,params=params, headers=self.headers)
res.encoding = "utf-8"
html = res.text
# html为[{1个电影信息},{},{}]
self.parsePage(html)
# 解析页面
def parsePage(self,html):
ins = 'insert into film values(%s,%s)'
rList = json.loads(html)
for rDict in rList:
name = rDict["title"]
score = rDict["score"]
L = [name.strip(),float(score.strip())]
self.cursor.execute(ins,L)
self.db.commit()
# 主函数
def workOn(self):
number = input("请输入数量:")
# 传递这些参数,会返回json格式的字符串
params = {
"type":"11",
"interval_id":"100:90",
"action":"",
"start":"0",
"limit":number
}
self.getPage(params)
if __name__ == "__main__":
spider = DoubanSpider()
spider.workOn()
自动化工具:selenium
selenium官方文档:https://selenium-python.readthedocs.io/
1.什么是selenium
-
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
-
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
-
selenium的基本使用
-
from selenium import webdriver driver = webdriver.Chrome() # driver = webdriver.Firefox() driver.get("http://www.baidu.com") print(driver.page_source) driver.close() # 浏览器对象(driver)的方法 1.driver.save_screenshot('xxx.png') 获取网页截屏 2.driver.get(url) : 发请求,获响应 3.driver.page_source : 获取html源码 4.driver.page_source.find('字符串') 查找失败 : -1 # 单元素查找 find_element_by_name find_element_by_id find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector # 多元素查找 find_elements_by_name find_elements_by_id find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector # 执行JavaScript from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.zhihu.com/explore") driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') driver.execute_script('alert("To Bottom")') # 获取文本值 text input = driver.find_element_by_class_name('zu-top-add-question') print(input.text) # 获取id, 位置, 标签名 input = driver.find_element_by_class_name('zu-top-add-question') print(input.id) print(input.location) print(input.tag_name) print(input.size) # cookie操作 get_cookies() add_cookie() delete_all_cookies() from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'zhaofan'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())
-
安装
- selenium+phantomjs/chromedrive强大网络爬虫组合
- chromdriver下载地址:https://chromedriver.storage.googleapis.com/index.html
- windows拷贝chromdriver.exe到Scripts目录下,Ubuntu拷贝到 /usr/bin/ 目录中
#案例
from selenium import webdriver
import time
# 先创建浏览器对象
driver = webdriver.Chrome()
# 打开百度
driver.get('http://www.baidu.com/')
# 找到搜索框,发送文字
key = input("请输入要搜索的内容:")
# 找到搜索框节点
kw = driver.find_element_by_id('kw')
kw.send_keys(key)
# 找到 百度一下 按钮节点,点击一下
su = driver.find_element_by_id('su')
su.click()
time.sleep(1)
# 截图
driver.save_screenshot('美女.png')
# 关闭浏览器
driver.quit()
from selenium import webdriver
import time
# 创建浏览器对象
driver = webdriver.Chrome()
# 访问京东首页
driver.get('https://www.jd.com/')
# 找到搜索框按钮,接收终端输入,发送到搜索框
text = driver.find_element_by_class_name('text')
key = input("请输入要搜索的内容:")
text.send_keys(key)
# 点击 搜索按钮
button = driver.find_element_by_class_name('button')
button.click()
while True:
# 执行脚本,进度条拉到最底部
driver.execute_script( 'window.scrollTo(0,document.body.scrollHeight)')
time.sleep(3)
# 提取数据,分析数据
rList = driver.find_elements_by_xpath('//div[@id="J_goodsList"]//li')
# rList : ['商品1节点对象','商品2节点对象']
for r in rList:
contentList = r.text.split('\n')
price = contentList[0]
name = contentList[1]
commit = contentList[2]
market = contentList[3]
d = {
"价格":price,
"名称":name,
"评论":commit,
"商家":market,
}
with open("jd.json","a",encoding="utf-8") as f:
f.write(str(d) + '\n')
# 点击下一页,-1表示没找到
if driver.page_source.find('pn-next disabled') == -1:
driver.find_element_by_class_name('pn-next').click()
time.sleep(3)
else:
print("爬取结束")
break
#下一页能点 : pn-next
#下一页不能点: pn-next disabled