当前位置:网站首页>scrapy爬虫爬取动态网站
scrapy爬虫爬取动态网站
2022-07-25 11:23:00 【托塔天王李】
爬取360图片上的美女图片
360图片网站上的图片是动态加载的,动态加载 就是通过ajax请求接口拿到数据喧染在网页上。我们就可以通过游览器的开发者工具分析,在我们向下拉动窗口时就会出现这么个请求,如图所示: 
所以就判定这个url就是ajax请求的接口:,http://image.so.com/zj?ch=beauty&sn=30&listtype=new&temp=1,通过分析,sn=30 表示取的是前面30条数据,sn=60取的是30到60条的数据,我们就可以通过改变sn的数来拿到不同的数据,下面就开始我们的scrap项目:
# 在虚拟环境里创建项目
scrapy startproject image360
# 创建蜘蛛
scrapy genspider image image.so.com项目目录结构如下: 
首先建立保存数据的模型:在items.py文件中
import scrapy
class ImageItem(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field() # 图片的标题
tag = scrapy.Field() # 图片的标签
width = scrapy.Field() # 图片的宽度
height = scrapy.Field() # 图片的高度
url = scrapy.Field() # 图片的url开始写蜘蛛:在iamge.py文件中
import scrapy
from urllib.parse import urlencode
from json import loads
class ImageSpider(scrapy.Spider):
name = 'image' # 蜘蛛的名字
allowed_domains = ['image.so.com'] # 允许访问的域名
# 因为不和以前一样给一个初始url,所以需要重写父类的start_requests方法
def strat_requests(self):
# 定义一个基础的url
base_url = 'http://image.so.com/zj?'
# 把固定的参数保存在一个字典里
param = {
'ch': 'beauty', 'listtype': 'new', 'temp': 1}
# 我们拿数据只需要改变sn的值,所以我们来个循环,我们拿300条数据
for page in range(10):
# 把sn和对应的数添加到字典里
param['sn'] = page * 30
# 一个完整的url
full_url = base_url + urlencode(param)
# 返回一个生成器,
yield scrapy.Request(url=full_url, callback=self.parse)
def def parse(self, response):
# 把从接口里拿到的数据转成字典
model_dict = loads(response.text)
# 找到对应的数据放在item里
for elem in model_dict['list']:
item = ImageItem()
item['title'] = elem['group_title']
item['tag'] = elem['tag']
item['width'] = elem['cover_width']
item['height'] = elem['cover_height']
item['url'] = elem['qhimg_url']
yield item
数据的持久化:在pipelines.py文件中
from scrapy import Request
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
from pymongo import MongoClient
# 下载图片的类,继承了scrap的ImagesPipeline类,并且重写了里面3个方法
class SaveImagePipeline(ImagesPipeline):
def get_media_requests(self, item, info):
yield Request(url=item['url'])
def item_completed(self, results, item, info):
if not results[0][0]:
raise DropItem('下载失败')
return item
# 获取文件的文件名的方法
def file_path(self, request, response=None, info=None):
return request.url.split('/')[-1]
# 保存到数据库的类
class SaveToMongoPipeline(object):
def __init__(self, mongo_url, db_name):
self.mongo_url = mongo_url
self.db_name = db_name
self.client = None
self.db = None
self.collect = None
# 把item数据存入mongo数据库里
def process_item(self, item, spider):
# item['image_name'] = item['url'].split('/')[-1]
# self.db.image.insert(dict(item))
self.collect.insert_one(dict(item))
return item
# 创建连接mongo数据库的方法,在开始爬虫程序时自动调用
def open_spider(self, spider):
self.client = MongoClient(self.mongo_url)
self.db = self.client[self.db_name]
self.collect = self.db.image
# 关闭连接的方法,在爬虫程序结束时自动调用
def close_spider(self, spider):
self.client.close()
# 这是个类方法
@classmethod
def from_crawler(cls, crawler):
# 当return cls时就会调用该类的初始方法__init__,就把连接mango数据库的参数和数据库名字传过去
# crawler.setting.get('MONGO_URL')就是拿到settings.py文件里设置的 MONGO_URL
return cls(crawler.settings.get('MONGO_URL'),
crawler.settings.get('MONGO_DB'))
在配置文件中开启pipelines

使用webdriver
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
def main():
driver = webdriver.Chrome()
driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(driver.page_source, 'lxml')
for img_tag in soup.body.select('img[src]'):
url = img_tag.attrs['src']
try:
if not str(url).startswith('http'):
url = 'http:' + url
filename = url[url.rfind('/') + 1:]
resp = requests.get(url)
with open('../images/' + filename,'wb') as f:
f.write(resp.content)
except OSError:
print(filename + '下载失败')
print('图片下载完成')
if __name__ == '__main__':
main()
边栏推荐
- Video caption (cross modal video summary / subtitle generation)
- Atomic atomic class
- R语言ggplot2可视化:可视化散点图并为散点图中的部分数据点添加文本标签、使用ggrepel包的geom_text_repel函数避免数据点之间的标签互相重叠(为数据点标签添加线段、指定线段的角度
- PHP 上传ftp路径文件到外网服务器上 curl base64图片
- Innovation and breakthrough! AsiaInfo technology helped a province of China Mobile complete the independent and controllable transformation of its core accounting database
- Mirror Grid
- 创新突破!亚信科技助力中国移动某省完成核心账务数据库自主可控改造
- GPT plus money (OpenAI CLIP,DALL-E)
- Atomic 原子类
- [comparative learning] understanding the behavior of contractual loss (CVPR '21)
猜你喜欢
![[RS sampling] a gain tuning dynamic negative sampler for recommendation (WWW 2022)](/img/23/0901da44160ca685d2c694ae9a834b.png)
[RS sampling] a gain tuning dynamic negative sampler for recommendation (WWW 2022)

OSPF comprehensive experiment

给生活加点惊喜,做创意生活的原型设计师丨编程挑战赛 x 选手分享

微信公众号开发 入手

Intelligent information retrieval (overview of intelligent information retrieval)

【AI4Code】《GraphCodeBERT: Pre-Training Code Representations With DataFlow》 ICLR 2021

【AI4Code】《CoSQA: 20,000+ Web Queries for Code Search and Question Answering》 ACL 2021

【对比学习】Understanding the Behaviour of Contrastive Loss (CVPR‘21)

从云原生到智能化,深度解读行业首个「视频直播技术最佳实践图谱」

winddows 计划任务执行bat 执行PHP文件 失败的解决办法
随机推荐
奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)
flink sql client 连接mysql报错异常,如何解决?
Median (二分答案 + 二分查找)
那些离开网易的年轻人
Intelligent information retrieval (overview of intelligent information retrieval)
【GCN多模态RS】《Pre-training Representations of Multi-modal Multi-query E-commerce Search》 KDD 2022
投屏收费背后:爱奇艺季度盈利,优酷急了?
马斯克的“灵魂永生”:一半炒作,一半忽悠
【GCN-RS】Towards Representation Alignment and Uniformity in Collaborative Filtering (KDD‘22)
selenium使用———安装、测试
dirReader. Readentries compatibility issues. Exception error domexception
Ups and downs of Apple's supply chain in the past decade: foreign head teachers and their Chinese students
嵌套事务 UnexpectedRollbackException 分析与事务传播策略
【黑马早报】运营23年,易趣网宣布关停;蔚来对大众CEO抛出橄榄枝;华为天才少年曾放弃360万年薪;尹烨回应饶毅炮轰其伪科学...
Intelligent information retrieval(智能信息检索综述)
Brpc source code analysis (I) -- the main process of RPC service addition and server startup
R语言ggpubr包ggarrange函数将多幅图像组合起来、annotate_figure函数为组合图像添加注释、注解、标注信息、fig.lab参数添加图像标签、fig.lab.face参数指定样式
Scott+Scott律所计划对Yuga Labs提起集体诉讼,或将确认NFT是否属于证券产品
Atomic 原子类
Web programming (II) CGI related