美文网首页虫虫
Python爬虫 零散知识点 笔记

Python爬虫 零散知识点 笔记

作者: 马本不想再等了 | 来源:发表于2019-02-24 16:55 被阅读104次

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.png

09. 使用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")

相关文章

网友评论

    本文标题:Python爬虫 零散知识点 笔记

    本文链接:https://www.haomeiwen.com/subject/wqrbyqtx.html