浏览器抓取网页(3.分析页码.py分析提取商品内容:利用PyQuery分析源码 )
优采云 发布时间: 2021-10-22 05:01浏览器抓取网页(3.分析页码.py分析提取商品内容:利用PyQuery分析源码
)
1.搜索关键词:使用Selenium驱动浏览器获取产品列表。
2.分析页码并翻页:获取产品页码,模拟翻页,获取后续页面的产品列表。
3. 分析提取产品内容:使用PyQuery分析源码,分析产品列表。
4.存入MongoDB:将产品列表信息存入数据库MongoDB。
蜘蛛.py
1 from selenium import webdriver
2 from selenium.common.exceptions import TimeoutException
3 from selenium.webdriver.common.by import By
4 from selenium.webdriver.support.ui import WebDriverWait
5 from selenium.webdriver.support import expected_conditions as EC
6 import re
7 from pyquery import PyQuery as pq
8 from urllib.parse import quote
9 import pymongo
10 from config import *
11
12 client = pymongo.MongoClient(MONGO_URL)
13 db = client[MONGO_DB]
14 browser = webdriver.Chrome()
15 wait = WebDriverWait(browser, 10)
16
17 def search():
18 try:
19 browser.get('https://www.taobao.com')
20 input = wait.until(
21 EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
22 )
23 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
24 input.send_keys('美食')
25 submit.click()
26 total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
27 get_products()
28 return total.text
29 except TimeoutEXception:
30 return search()
31
32 def next_page(page_number):
33 try:
34 input = wait.until(
35 EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
36 )
37 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
38 input.clear()
39 input.send_keys(page_number)
40 submit.click()
41 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)))
42 get_products()
43 except TimeoutException:
44 next_page(page_number)
45
46 def get_products():
47 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
48 html = browser.page_source
49 doc = pq(html)
50 items = doc('#mainsrp-itemlist .items .item').items()
51 for item in items:
52 product = {
53 'image': item.find('.pic .img').attr('src'),
54 'price': item.find('.price').text(),
55 'deal': item.find('.deal-cnt').text()[:-3],
56 'title': item.find('.title').text(),
57 'shop': item.find('.shop').text(),
58 'location': item.find('.location').text()
59 }
60 print(product)
61 save_to_mongo(product)
62
63 def save_to_mongo(result):
64 try:
65 if db[MONGO_TABLE].insert(result):
66 print('保存MONGOBD成功',result)
67 except Exception:
68 print('存储到MONGODB失败',result)
69
70 def main():
71 total = search()
72 total = int(re.compile('(\d+)').search(total).group(1))
73 for i in range(2,total+1):
74 next_page(i)
75 browser.close()
76
77 if __name__ == '__main__':
78 main()
配置文件
1 MONGO_URL = 'localhost'
2 MONGO_DB = 'taobao'
3 MONGO_TABLE = 'products'
从Chrome 59版本开始,开始支持Headless模式,即无界面模式,让浏览器在爬行时不会弹出。如果要使用此模式,请将 Chrome 升级至 59 及以上版本。开启 Headless 模式的方法如下:
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
首先创建一个ChromeOptions对象,然后添加headless参数,然后在初始化Chrome对象时通过chrome_options传递这个ChromeOptions对象,这样我们就可以成功开启Chrome的headless模式了。
连接火狐浏览器非常简单,只需要做一个改动:
browser = webdriver.Firefox()
这里我们改变了浏览器对象的创建方式,这样抓取的时候会使用Firefox浏览器。
如果不想使用Chrome的Headless模式,也可以使用PhantomJS(它是非界面浏览器)来抓取。爬取时不会弹窗,或者只需要修改WebDriver的语句:
修改代码:
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
#browser = webdriver.Chrome()
browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
wait = WebDriverWait(browser, 10)
browser.set_window_size(1400, 900)
此外,它还支持命令行配置。比如可以设置缓存和禁止图片加载功能,进一步提高抓取效率:
MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_TABLE = 'products'
SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']