我们先创建一个爬虫项目,这里我们用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',