浏览器抓取网页(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']

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线