【Python】03-使用Selenium+Pyquery爬取淘
2018-05-29 本文已影响97人
b861a75d2a7d
需求分析:
需求分析1.先做好准备工作,导入要用到的模块。
from selenium import webdriver
from pyquery import PyQuery as pq
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from config import *
import pymongo
2.初始化浏览器和设置需要用的mongodb数据库。
#如果不想打开浏览器就可以执行代码,可以这样设置
# option = webdriver.ChromeOptions()
# option.add_argument("headless")
# driver = webdriver.Chrome(chrome_options=option)
#初始化浏览器为谷歌浏览器
browser =webdriver.Chrome()
#设置等待时间
wait = WebDriverWait(browser,10)
#设置数据库参数
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
3.为了方便使用mongodb数据库储存爬取下来的信息,还需要创建一个配置文件:config.py。
下面是config.py中的代码:
#数据库地址
MONGO_URL = 'localhost'
#存储的数据库名称
MONGO_DB = 'taobao'
#表名称
MONGO_TABLE= 'result'
下面开始正式的代码编写:
4.定义一个搜索函数,用于打开淘宝首页,并搜索指定关键词语。
def search(key_word):
try:
browser.get('https://www.taobao.com')
#设置等待时间,判断输入框和搜索按钮是否加载完成
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#q')))
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
#输入关键词 健身
input.send_keys(key_word)
#点击搜索按钮
submit.click()
# 得到页面总页数,并返回,为后面设置翻页做准备
page_count = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
#get_info()是获取我们的信息的一个方法
get_info()
return page_count.text
except Exception:
print('出现错误,重新请求页面')
search(key_word)
5.上面的函数,只可以跳转到搜索结果的第一页就结束了,所有我们还需要一个函数,用来帮助我们翻页。
def next_page(page_number):
try:
#翻页之前,我们需要设置一个等待时间,
#用来判断 页码输入框 和 确定翻页按钮 是否加载完成
#页码输入框
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input')))
#翻页 确定 按钮
submit = wait.until(EC.element_to_be_clickable((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_info()是获取我们的信息的一个方法
get_info()
except Exception:
#如果发生错误,重新发起请求
next_page(page_number)
- 到现在为止,上面的两个函数已经可以帮助我们实现打开淘宝网,搜索关键词,并自动翻页的功能。但是我们的目的还没有达到,我们还需要获取每件商品具体信息,并存到mongodb数据库。所以我们的还要继续。。
6.使用Pyquery获取每页的商品信息。
def get_info():
'''通过selenium中的page_soure方法获取页面源码,然后使用pyquery库解析,提取关键信息'''
#获取商品信息之前,我们需要判断商品信息是否加载完成
wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist > div > div')))
#使用selenium中的page_source方法获取页面源码
html = browser.page_source
#使用Pyquery解析源代码,在导入方法的时候,我们已经给Pyquery()设置了别名pq,所以这里是pq
html = pq(html)
# 找到商品的节点,并使用items()方法,返回列表形式的键值对
items = html('#mainsrp-itemlist .items .item').items()
#遍历获取商品信息
for item in items:
item = {
#商品主图
'image':item.find('.pic .img').attr('src'),
#商品价格
'price ':item.find('.price ').text(),
#人气
'popularity':item.find('.deal-cnt').text(),
#商品标题
'title':item.find('.title').text(),
#店铺名称
'shop':item.find('.shop').text(),
#商家的地区
'location':item.find('.location').text()
}
print(item)
#save_to_mogodb()是一个把数据存储到mongodb数据库的方法,接下里我们就要定义这一个函数
save_to_mogodb(item)
7.使用mongodb数据库存储我们获取到的数据。
def save_to_mogodb(result):
try:
if db[MONGO_TABLE].insert(result):
print('保存mongo成功')
except Exception:
print('存储失败',result)
8.万事俱备只欠东风,所有的准备工作都已经完成的情况下,我们还需要一个主函数,把所有的方法组合起来,完成一系列的工作。
def main(key_word):
#首先使用搜索函数,把总页数返回
page_count = search(key_word)
# 在通过正则表达式,把返回的信息“共 100 页”中的数字提取出来
page_count = int(re.compile('(\d+)').search(page_count).group(1))
#通过range()方法生成所有页码
#因为第1页我们已经获取了,所有这里翻页从第2页开始
for i in range(2,page_count+1):
next_page(i)
if __name__ == '__main__':
main('健身')
9.接下来我们让程序跑起来就OK了。
Github下载地址
配置文件config.py
注意:配置文件config.py需要一起下载。
参考文档:
1.静觅 » [Python3网络爬虫开发实战] 7.1-Selenium的使用
2.静觅 » [Python3网络爬虫开发实战] 7.4-使用Selenium爬取淘宝商品
3.静觅 » [Python3网络爬虫开发实战] 4.3-使用pyquery