Python爬虫学习(二)使用Selenium和PyQuery爬取网页

这篇博客介绍了如何使用Python的Selenium和PyQuery库来模拟浏览器行为,抓取淘宝商品信息,并将其存储到MongoDB数据库中。详细步骤包括分析网页结构、模拟搜索、翻页、解析商品列表以及数据保存。
摘要由CSDN通过智能技术生成

1.概述:

使用Selenium模拟浏览器访问网页,利用PyQuery库解析获取到的网页,然后将获取到的信息保存到MongoDB数据库中,这里以淘宝为例,提取商品的信息。

2.准备工作:

安装MongoDB

现在最新版是4.0,直接去官网下载,然后一直默认安装就可以用了。具体安装过程可以参考下面的两篇博客。
https://blog.csdn.net/Dorma_Bin/article/details/80851230
https://blog.csdn.net/shu15121856/article/details/80736092
然后测试是否可用,4.0之后,默认就开启了系统服务,不用手动配置到服务了。

安装Robomongo

Robomongo是mongodb的一个图形化工具,可以很方便的查看存取的数据信息。

robomongo

3.分析网页

在相关的环境配置好了之后,我们就可以来分析需要爬取的页面。以搜索python关键词为例。

taobao1
可以看到它的请求链接中包含了几个GET参数,如果要想构造Ajax链接,直接请求再好不过了,它的返回内容是JSON格式,直接爬取相对比较繁琐,这里采用selenium模拟浏览器。

taobao2
我们需要获取的是商品信息,打开一个商品,查看它的源代码结构是怎样的。以下面这个商品为例。

python商品
我们需要从中提取出商品的基本信息,包括商品图片、名称、价格、购买人数、店铺名称和店铺所在地。它的源代码如下图所示:

商品源码

4.模拟搜索

网页分析完毕后,通过代码来实现它。首先selenium模拟浏览器打开淘宝页面,这里创建了一个webdriver对象,用来打开Chrome浏览器,等待加载时,我们使用了WebDriverWait对象,它可以指定等待条件,同时指定一个最长等待时间,这里指定为最长10秒。如果在这个时间内成功匹配了等待条件,也就是说页面元素成功加载出来了,就立即返回相应结果并继续向下执行,否则到了最大等待时间还没有加载出来时,就直接抛出超时异常。
presence_of_element_located这个条件,用来判断商品的信息是否加载出来,从网页的源码中得到,搜索框的标签是#q,通过CSS选择器,选中搜索框的标签,搜索按钮的标签为#J_TSearchForm > div.search-button > button,然后将需要搜索的关键词输入到输入框中。

import re
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

KEYWORD = 'Python'
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)

# 搜索索引页面,用selenium控制自动搜索
def search():
    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(KEYWORD)   # 传入需要搜索的关键词
        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:
        return search()

5.读取多个页面

这里只是一个页面的结果,我们还需要设置一个自动翻页,读取多个页面的数据。如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值