以爬取Macbook商品信息为例,通过Selenium实现可见即可爬的功能
关于Selenium的driver配置问题
1. 分析搜索方式
=MacBook&enc=utf-8&wq=MacBook&pvid=4c32f7c145fb48b2b5910a625501205d
简化一下就是:=MacBook
可知可以根据URL中的keyword实现搜索,查询
2. 分析商品元素
可见每个商品都在class为gl-warp clearfix的ul下的li下,商品的信息都在其中的div中,这就好办了,re,xpath,pyquery都可以得到商品的信息了。
3. 分析如何进行翻页
由URL可知是由page控制且每增加两位翻一页
=MacBook&page=3
1. 引用的包,全局变量...:
from selenium import webdriver
ptions import TimeoutException
from selenium.webdrivermon.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from multiprocessing.pool import Pool
from urllib.parse import quote
from pyquery import PyQuery as pq
import pymongo
import timeoptions = webdriver.ChromeOptions()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)
wait = WebDriverWait(browser,10)
KEYWORD = 'macbook'MONGO_DB = 'jd'
MONGO_COLLECTION = 'products'
client = pymongo.MongoClient('mongodb://admin:1234qwer@localhost:27017')
db = client[MONGO_DB]headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36','x-requested-with':'XMLHttpRequest'#分析页面的时候看到有ajax解析,应该是用于翻页的
}
因为最后需要将数据存储在mongodb中,故需要引用pymongo,搜索的关键词由KEYWORD来控制。
学习时一定要摸清楚selenium的显式等待和隐式等待,selenium其实就是模仿人类去点击网页,这中间js渲染网页,需要一些时间,如果不做相应的处理会浪费大量的时间,从而影响爬虫效率,我这里只是定义了一个简单的隐式等待。
其中加入的参数 '--headless' 可以实现隐藏web窗口的功能
2. 搜索爬取块:
def index_page(page):'''抓取索引页:param page: 页码:return: 网页源码'''print('正在爬取第', page, '页')try:url = '={}&enc=utf-8&page={}'.format(quote(KEYWORD),page*2-1)print((url)time.sleep(2)return browser.page_source# browser.close()except TimeoutException:index_page(page)
由page控制翻页,page*2-1即可实现一页一页的爬取,爬取成功时返回网页源代码,不成功时重新爬取该页信息
3. 提取商品信息块:
通过css定位,Google,搜狐都会有右键定位的功能,可以结合他们提供的位置然后再进一步优化
def get_products(html):'''提取商品信息:param html: 网页源码:return:'''# html = browser.page_sourcedoc = pq(html)items = doc('#J_goodsList > ul > li').items()#因为全部都在ul下的li中for item in items:product = {'image': item.find('div > div.p-img > a > img').attr('src'),#J_goodsList > ul > li:nth-child(1) > div > div.p-img > a > img'price': item.find('div > div.p-price > strong > i').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-price > strong > i'talk': item.find('div > div.p-commit > strong > a').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-commit > strong > a'title': item.find('div > div.p-name.p-name-type-2 > a > em').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-name.p-name-type-2 > a > em'shop': item.find('div.p-shop > span > a').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-shop > span > a'href': item.find('div > div.p-img > a').attr('href'),#J_goodsList > ul > li:nth-child(1) > div > div.p-img > a}print(product)save_to_mongodb(product)#保存到mongodbdef save_to_mongodb(product):try:if db[MONGO_COLLECTION].insert(product):print('Save_Successful!!!')#保存成功!except Exception:print('Error save OR Done')
利用pyquery定位可以提高定位的速度,定位成功后再由存储模块保存
from selenium import webdriver
ptions import TimeoutException
from selenium.webdrivermon.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from multiprocessing.pool import Pool
from urllib.parse import quote
from pyquery import PyQuery as pq
import pymongo
import time
import csvoptions = webdriver.ChromeOptions()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)
wait = WebDriverWait(browser,10)
KEYWORD = 'macbook'MONGO_DB = 'jd'
MONGO_COLLECTION = 'products'
client = pymongo.MongoClient('mongodb://admin:1234qwer@localhost:27017')
db = client[MONGO_DB]headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36','x-requested-with':'XMLHttpRequest'
}def index_page(page):'''抓取索引页:param page: 页码:return: 网页源码'''print('正在爬取第', page, '页')try:url = '={}&enc=utf-8&page={}'.format(quote(KEYWORD),page*2-1)print((url)time.sleep(2)return browser.page_source# browser.close()except TimeoutException:index_page(page)def get_products(html):'''提取商品信息:param html: 网页源码:return:'''# html = browser.page_sourcedoc = pq(html)items = doc('#J_goodsList > ul > li').items()# print(items)for item in items:# print(item)product = {'image': item.find('div > div.p-img > a > img').attr('src'),#J_goodsList > ul > li:nth-child(1) > div > div.p-img > a > img'price': item.find('div > div.p-price > strong > i').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-price > strong > i'talk': item.find('div > div.p-commit > strong > a').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-commit > strong > a'title': item.find('div > div.p-name.p-name-type-2 > a > em').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-name.p-name-type-2 > a > em'shop': item.find('div.p-shop > span > a').text(),#J_goodsList > ul > li:nth-child(1) > div > div.p-shop > span > a# 'href': re.findall('href="(.*?)"',item.find('div > div.p-img > a').html())#J_goodsList > ul > li:nth-child(11) > div > div.p-img > a #J_goodsList > ul > li:nth-child(22) > div > div.p-img > a'href': item.find('div > div.p-img > a').attr('href'),#J_goodsList > ul > li:nth-child(1) > div > div.p-img > a}print(product)save_to_mongodb(product)def save_to_mongodb(product):try:if db[MONGO_COLLECTION].insert(product):print('Save_Successful!!!')except Exception:print('Error save OR Done')if __name__ == '__main__':# pool = Pool()# group = [i for i in range(1,78)]# print(group)# pool.map(main, group)# pool.close()# pool.join()for i in range(1,78):#一共77页get_products(index_page(i))
这样子就实现了selenium的可见可爬的功能了
也可以通过搭建pool池,实现多进程爬取网页,提高爬取速度
三,运行
本文发布于:2024-02-01 14:54:15,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170677045737400.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |