爬虫第四篇
处理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()
自动化工具
2. selenium+phantomjs/chrome强大网络爬虫组合
-
selenium
1. Web自动化测试工具,应用于Web自动化测试
2. 特点
1. 可以运行在浏览器,根据指定命令操作浏览器,让浏览器自动加载页面(可以处理Ajax请求)
2. 只是工具,需要与第三方浏览器结合使用
3. 安装
(管理员Anaconda Prompt):
conda install selenium
4. phantomjs -v -
无界面浏览器(无头浏览器)
1. 特点
1. 把网站加载到内存进行页面加载
2. 运行高效
2. Windows安装
1. 把下载的exe文件,拷贝到python安装目录的Scripts目录下
C:\ProgramData\Anaconda3\Scripts
cmd
phantomjs -v -
Ubuntu安装
- 下载安装包并解压:phantomjs-2.1.1-.
- cd到解压的路径的 bin 目录下
- 把文件拷贝到 /usr/bin/ 目录中
sudo cp phantomjs /usr/bin - 终端 : phantomjs -v
-
chromedriver
- 下载并安装
- https://chromedriver.storage.googleapis.com/index.html
- 查看Chrome浏览器版本
设置 - 帮助 - 关于Google chrome - 拷贝chromdriver.exe到Scripts目录下
- chromedriver -v
-
浏览器对象(driver)的方法
1.driver.save_screenshot(‘xxx.png’) 获取网页截屏
2.driver.get(url) : 发请求,获响应
3.driver.page_source : 获取html源码
4.driver.page_source.find(‘字符串’) 查找失败 : -1
6.单元素查找(节点对象,只找第1个,search)
1.driver.find_element_by_id(’’)
2.driver.find_element_by_name(’’)
3.driver.find_element_by_class_name()
4.driver.find_element_by_xpath(’’)
7.多元素查找(列表) 返回列表
1.driver.find_elements_by_id(’’)
2.driver.find_elements_by_name(’’)
3.driver.find_elements_by_class_name()
4.driver.find_elements_by_xpath(’’)
5.利用节点对象的 text 属性可获取文本内容
8. 节点对象.send_keys(’’)
9. 节点对象.click()
#案例
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