01. 在解析网页时,补全某个元素的url
在解析很多网页时,会发现需要获取的元素的url不完整,需要补充该元素所在网站的域名。
这时候可以采用parse函数来实现url补全
下面是在获取到response之后,需要补全解析出来的image_url时的情况示例。
from urllib import parse
image_url = parse.urljoin(response.url, image_url)
02. 在安装某些库的时候,可以使用豆瓣园镜像,提高下载速度
例如安装pillow库
pip install pillow
原始写法
pip install -i https://pypi.douban.com/simple pillow
使用豆瓣园镜像下载的写法
03. Scrapy框架中设置settings,快速下载图片
以下载伯乐在线文章标题页的图片为例,在settings中进行pipeline的设置
import os
# settings 文件中的修改内容
ITEM_PIPELINES = {
'ArticleSpider.pipelines.ArticlespiderPipeline':300,
# 添加一个专属的图片下载管道
'scrapy.pipelines.images.ImagePipeline':100,
}
# 直接从item中获取图片,但是获取的是一个数组
IMAGES_URLS_FIRLD = "front_image_url"
# 生成文件夹路径
project_dir = os.path.abspath(os.path.dirname(__file__))
# 生成存储文件夹images,并指定路径
IMAGES_STORE = os.path.join(project_dir, 'images')
因为IMAGES_URLS_FIRLD = 'front _image_url' 获取的是数组,所以在spider中返回的item里这个封面连接要是数列的形式,也就是要加上[ ]
# spider中的修改内容
...
article_item["create_date"] = create_date
article_item["front_image_url"] = [front_image_url]
article_item["praise_nums"] = praise_nums
...
yield article_item
04. 使用Scrapy提供的export导出json文件
from scrapy.exporters import JsonItemExporter
class JsonExporterPipeline(object):
def __init__(self):
self.file = open('article.json', 'wb')
self.exporter = JsonItemExporter(self.file, encoding='utf-8', ensure_acsii=False)
self.exporter = start_exporting()
def close_spider(self, spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self, item, spider)
self.exporter.export_item(item)
return item
05. Scrapy中使用codecs来导出json文件
在pipeline中自定义一个类,调用codecs来写入文件
import codecs
import json
class JsonWithEncodingPipeline(object):
def __init__(self):
self.file = codecs.open('article.json', 'w',ecoding="utf-8")
def process_item(self, item, spider):
# 这里item不是一个字典类型,可以直接进行转换
lines = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(lines)
return item
def spider_closed(self, spider):
self.file.close()
06. Scrapy中关于ItemLoader部分知识
6.1 通过ItemLoader加载item
在解析网页元素时,可以通过ItemLoader加载item,加载出来的item都是list形式。
from scrapy.loader import ItemLoader
# 通过ItemLoader加载item
item_loader = ItemLoader(item=JobBoleArticleItem(), response=response)
# 使用css提取
item_loader = add_css("title", ".entry-header h1::text")
# 使用xpath提取
item_loader = add_xpath("praise_nums", "//div[@class='post-adds']//h10/text()")
# 使用value提取
item_loader = add_value("url", response.url)
item_loader = add_value("front_image_url", [front_image_url])
article_item = item_loader.load_item()
6.2 在item.py中使用MapCompose对item进行处理
from scrapy.loader.processors import MapCompose
def add_jobbole(value)
return value + "-jobbole"
class = JobBoleArticleItem(scrapy.Item)
# 使用MapCompose调用外部函数,对item进行预处理
title = scrapy.Field(
# MapCompose中放入多个函数,会被从左到右依次调用
input_processor = MapCompose(add_jobbole)
)
# 使用MapCompose调用lambda函数,对item进行预处理
create_date = scrapy.Field(
input_processor = MapCompose(lambda x:x+"-jobbole")
)
6.3 在item.py中自定义ItemLoader,调用TakeFirst
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst
# 自定义一个ItemLoader,但是注意要继承ItemLoader
class ArticleItemLoader(ItemLoader):
default_output_processor = TakeFirst()
# TakeFirst 可以取出列表item中的第一个值
# 要使用自定义的ArticleItemLoader时,记得在解析网页时导入ArticleItemLoader,而不是原有的ItemLoader
07. 使用fake-useragent库来随机更换UA
pip install fake-useragent
from fake_useragent import UserAgent
ua = UserAgent()
User-Agent: ua.random
在scrapy的middlewares中编写随机切换的user-agent
class RandomUserAgentMiddleware(object):
# 随机切换user-agent
def __init__(self, crawler):
super(RandomUserAgentMiddleware, self).__init__()
self.ua = UserAgent()
@classmethod
def from_crawler(cls, crawler):
return cls(crawler)
def process_request(self, request, spider):
request.headers.setdefault('User-Agent', self.ua.random)
可以pip install list 查看fake-useragent的版本,然后去查一下的网页上维护的user-agent
08. CSS选择器 笔记
CSS - 1.png CSS - 2.png CSS - 3.png09. 使用github上已有的动态ip库(收费)
scrapy-crawlera
pip install scrapy-crawlera
10. 使用selenium不加载图片打开网页
提高网页加载速度,进而提高爬取效率
from selenium import webdriver
chrome_opt = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_opt.add_experimental_option("prefs", prefs)
browser = webdriver.Chrome(executable_path="D:\SoftWare\chromedriver\chromedriver.exe", chrome_options=chrome_opt)
browser.get("http://www.taobao.com")
网友评论