python爬虫之动态网页爬取——poco爬虫

本文介绍了如何使用Scrapy和Selenium框架爬取Poco网站上的动态网页图片。首先通过分析页面结构和网络请求,发现页面由JS动态生成并采用懒加载。尝试直接修改请求参数获取数据失败后,利用Selenium模拟浏览器滚动加载,配合MongoDB存储数据。在爬虫运行过程中,由于MongoDB的cursor超时问题导致爬虫提前终止,解决方案是将所有id一次性加载到列表中。最终成功实现动态页面的图片爬取并按ID分类存储。
摘要由CSDN通过智能技术生成

我们先创建一个爬虫项目,这里我们用scrapy框架来创建。

scrapy startproject poco

然后cd 到 poco文件夹中初始化一下项目

scrapy genspider pocoSpider poco.com

打开项目,项目目录结构如下
在这里插入图片描述
我们的爬虫代码就写在pocoSpider文件中,现在我们打开网站分析一下网页。
我们选择人像分类来爬取
https://www.poco.cn/works/works_list?classify_type=1&works_type=medal
可以看到页面是有很多用户id,我们要先拿到每个id的url再进去详情页抓取图片。

右键查看网页源代码,发现页面是有js动态生成的网页
在这里插入图片描述
而且页面是懒加载的,右键审查元素,查看网络
在这里插入图片描述
找到请求图片的请,拿到请求参数,url地址,复制到postman里面调用一下,成功拿到返回数据

在这里插入图片描述
分析请求参数,猜想是否能够通过,修改参数来获得响应结果,但是修改请求参数后,请求失败,看来直接修改参数的方式不能拿到我们需要的url地址。

我们随意点进去个查看网页源代码,看看详情也是否也是js动态加载的页面。
在这里插入图片描述
很幸运,可以在源代码里面直接查看到我们需要的数据,每张图片的地址就在 标签里面,那就简单了。我们可以先爬取这个页面的图片

import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


class PocospiderSpider(scrapy.Spider):
    name = 'pocoSpider'
    allowed_domains = ['poco.com']
    start_urls = ['https://www.poco.cn/works/detail?works_id=20992476']

    def parse(self, response):
        img_list = response.xpath("//img/@data-src").extract()
        for img in img_list:
            print(img)



if __name__ == "__main__":
    process = CrawlerProcess(get_project_settings())
    process.crawl('pocoSpider')
    process.start()

如设想的一样,我们成功拿到了当前id里面的所有图片:
在这里插入图片描述
我们现在只需要拿到所有id对应的url地址再循环请求就能拿到所有图片的地址了
既然通过修改参数的方式不能够拿到数据,那我们就用selenium框架来模拟浏览器操作。
分析页面,当每次下拉到最后发送请求。我们关闭页面的图片加载,以便加速访问.我们把爬取到的数据存储到数据库中,这里我们用mongod。定义下拉刷新的函数,execute_times 每次刷新后睡眠0.5秒以便浏览器渲染页面。我们这里刷新40次来获得数据。
我们在setting.py文件中设置好数据库的地址,端口,数据库名称

LOCAL_MONGO_HOST = '127.0.0.1'
LOCAL_MONGO_PORT = 27017
DB_NAME = 'POCO'

写好selenium模拟操作的代码

from pymongo.errors import DuplicateKeyError
from selenium import webdriver
import time
from lxml import etree
import pymongo
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
chrome_opt = webdriver.ChromeOptions()
prefs = {
   'profile.managed_default_content_settings.images': 2}
chrome_opt.add_experimental_option('prefs',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值