崔庆才老师爬虫的学习笔记。

一、爬取实战

1、准备

selenium、pyquery、re、pymongo

2、流程

(1)目标站点分析:
用浏览器打开淘宝首页输入‘美食’,打开审查元素,分析我们要的商品信息都在Element里哪个分段。

(2)搜索关键字:
利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。

(3)分析页码并翻页:
得到商品页码数,模拟翻页,得到后续页面的商品列表。

(4)分析提取商品内容:
利用PyQuery分析源码,解析得到商品列表。

(5)储存到MongoDB:
将商品列表信息储存到数据库MongoDB。

3、实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import re
import pymongo
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
from config import *

'''使用PhantomJS无界面浏览器,注意需要设置下窗口大小,否则有的元素获取不到会报错'''
#browser = webdriver.PhantomJS()
#browser.set_window_size(1400,900)

'''可以给PhantomJS设置些选项,从而增加效率。比如:不加载图片、设置缓存等'''
#SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
#browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
#browser.set_window_size(1400,900)

'''chrome也可以设置无界面模式,Mac和Linux需要chrome59版本,Windows需要chrome60版本'''
#chrome_options = webdriver.ChromeOptions()
#chrome_options.add_argument('--headless')
#browser = webdriver.Chrome(chrome_options=chrome_options)

browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)
client = pymongo.MongoClient(MONGO_URL) #声明mongodb客户端,MONGO_URL从配置文件config.py获取
db = client[MONGO_DB] #定义数据库,MONGO_DB从配置文件config.py获取。注意中括号[]

def search(): #首页搜索关键字
print('正在搜索')
try:
browser.get('http://www.taobao.com')
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))) #等待搜索框加载
submit = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button.btn-search'))) #等待搜索按钮加载
input.send_keys(KEYWORD) #输入搜索关键字,KEYWORD从配置文件config.py获取
submit.click()
total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total'))) #获取总页数
get_products()
return total.text #返回总页数
except TimeoutException: #捕捉browser超时异常
return search() #超时异常后,重新进行搜索即可

def next_page(page_number): #输入页码,进行翻页
print('正在翻页')
try:
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input'))) #等待页码输入框
submit = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))) #等待提交按钮
input.clear() #输入前先清除内容
input.send_keys(page_number)
submit.click()
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number))) #等待高亮页码数值显示跳转的页码,确定跳转完成
get_products()
except TimeoutException:
return next_page(page_number) #超时异常后,重新进行翻页即可

def get_products(): #获取当页商品数据
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
html = browser.page_source #获取当前页面源码
doc = pq(html) #声明pyquery对象
items = doc('#mainsrp-itemlist .items .item').items() # 获取当前页所有商品对象
for item in items: #遍历所有商品
product = {
'image':item.find('.pic .img').attr('src'),
'price':item.find('.price').text(),
'deal':item.find('.deal-cnt').text()[:-3],
'title':item.find('.title').text(),
'shop':item.find('.shop').text(),
'location':item.find('.location').text()
}
save_to_mongo(product)

def save_to_mongo(result): #保存到mongodb数据库
try:
if db[MONGO_TABLE].insert(result): #判断数据插入到数据表中,MONGO_TABLE从配置文件config.py中获取
print('存储到MongoDB成功',result)
except Exception:
print('存储到MongoDB失败',result)

def main():
try:
total = search()
total = int(re.compile('(\d+)').search(total).group(1)) #正则匹配对象,搜索总页数字符串,结果索引1,转为int型就是总页数了
for i in range(2,total+1): #从第二页开始循环翻页
next_page(i)
except Exception:
print('浏览器出错啦')
finally:
print('爬取完成')
browser.close() #完成后一定关闭浏览器

if __name__ == '__main__':
main()

config.py

1
2
3
4
5
6
7
8
9
# coding: utf-8

#config.py

KEYWORD = '美食'

MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_TABLE = 'product'

持续更新…

× 多少都行~
打赏二维码