工作需要,临时学习一下Python,记录一些学习资料和经验

python3语言入门

菜鸟教程

python3环境

Windows Python3 安装VSCode扩展

爬虫快速入门

第一步:Get获取网页html

第二步:根据html界面规则,定位提取自己想要的数据

入门实战:使用requests和beautifulsoup4从小说网站爬取并保存小说

需要安装的库:

python库

作用

cmd安装命令

文档

requests

发送网络HTTP请求

pip install requests

docs

beautifulsoup4

从HTML或XML文件中提取数据

pip install beautifulsoup4

docs

进阶实战项目

爬虫框架scrapy

中文文档

方便快捷的爬虫框架,复杂的爬虫规则可能不适用。

cmd安装命令:pip install scrapy

scrapy主要命令

主要命令

cmdline

备注

创建项目

scrapy startproject [exampleproject]

创建爬虫

scrapy genspider [examplespider] [“example.com”]

settings.py所在目录下执行

执行爬虫

scrapy crawl [examplespider]

scrapy.cfg所在目录下执行

scrapy实战

scrapy实战:使用scrapy爬取电影网站数据

  1. 创建scrapy项目
    scrapy startproject MovieSpider
  2. 创建爬虫spider
    cd MovieSpider
    scrapy genspider job_position “ygdy8.net”
    job_position是爬虫名,后面运行爬虫时会用到,ygdy8.net是爬取的域范围
MovieSpider
  ├── MovieSpider
  │   ├── __init__.py
  │   ├── items.py
  │   ├── middlewares.py
  │   ├── pipelines.py
  │   ├── __pycache__
  │   ├── settings.py
  │   └── spiders
  │       ├── __init__.py
  │       └── __pycache__
  │       └── job_position.py
  └── scrapy.cfg

路径

说明

scrapy.cfg

项目的总配置文件,通常无须修改。

MovieSpider

项目的 Python 模块,程序将从此处导入 Python 代码。

MovieSpider/items.py

用于定义项目用到的 Item 类。Item 类就是一个 DTO(数据传输对象),通常就是定义 N 个属性,该类需要由开发者来定义。

MovieSpider/middlewares.py

中间件文件,hook爬虫流程一些步骤,如输出数据前过滤掉不想要的数据、或过滤掉失败的请求处理。

MovieSpider/pipelines.py

项目的管道文件,它负责处理爬取到的信息。该文件需要由开发者编写。

MovieSpider/settings.py

项目的配置文件,在该文件中进行项目相关配置。如默认请求头、管道等。

MovieSpider/spiders

在该目录下存放项目所需的蜘蛛,蜘蛛负责抓取项目感兴趣的信息。

MovieSpider/spiders/job_position.py

开发者定义的蜘蛛,开发者在这里设置请求地址和解析数据的规则。

  1. Item.py定义属性
import scrapy

class MoviespiderItem(scrapy.Item):
    #电影名
    name = scrapy.Field()
    #uri
    uri = scrapy.Field()
  1. 编写spider类
import scrapy
from MovieSpider.items import MoviespiderItem
#注意在上面导入MoviespiderItem包
class JobPositionSpider(scrapy.Spider):
    name = 'job_position'
    allowed_domains = ['ygdy8.net']
    #这里写上你要爬取的页面
    start_urls = ['https://www.ygdy8.net/html/gndy/china/index.html']

	#爬取的方法
    def parse(self, response):
        
        item =  MoviespiderItem()
        #匹配
        for jobs_primary in response.xpath('//table[@class="tbspan"]'):
            item['name'] = jobs_primary.xpath ('./tr/td/b/a[2]/text()').extract()
            item['uri']  = jobs_primary.xpath ('./tr/td/b/a[2]/@href').extract()
            #不能使用return 
            yield item
  1. pipelines.py处理Item输出
class  MoviespiderPipeline(object):
    def process_item(self, item, spider):
        print("name:",item['name'])
        print("url:",item['url']) #这里就打印出来
  1. 修改settings.py文件
BOT_NAME = 'MovieSpider'
 SPIDER_MODULES = ['MovieSpider.spiders']
 NEWSPIDER_MODULE = 'MovieSpider.spiders'
 ROBOTSTXT_OBEY = True
# 配置默认的请求头 User-Agent与浏览器一致
DEFAULT_REQUEST_HEADERS = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0",
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
# 配置使用Pipeline 后面的数字是优先级从低到高
ITEM_PIPELINES = {
     'MovieSpider.pipelines.MoviespiderPipeline': 300,
}
  1. 运行spider
    scrapy crawl job_position

PS:入门实战的例子适用于对静态网页收集数据,动态网页看下一篇。

其他

python文件运行scrapy命令

scrapy.cfg所在目录下添加main.py

from scrapy import cmdline

#导入cmdline模块,可以实现控制终端命令行。
import os  # 用来设置路径

# 获取当前脚本路径
dirpath = os.path.dirname(os.path.abspath(__file__))

#切换工作目录
os.chdir(dirpath)

cmdline.execute('scrapy crawl job_position'.split())

scrapy.xpath

XPath教程


scrapy输出到mongoDB

安装:pip install pymongo
添加输出到mongodb的管道
pipelines.py

from itemadapter import ItemAdapter
import pymongo
from scrapy.utils.project import get_project_settings 
#获取settings.py文件中的数据需要导入这个

class FirstspiderMongo:
  
    def __init__(self):
        settings = get_project_settings()
        self.mongo_uri = settings['MONGO_HOST']
        self.mongo_db = settings['MONGO_DB']
        self.mongo_port = settings['MONGO_PORT']
        self.mongo_collection = settings['MONGO_COLL']

    @classmethod
    def from_crawler(cls, crawler):
        return cls()

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri,port=self.mongo_port)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.mongo_collection].insert_one(ItemAdapter(item).asdict())
        return item
    #记得将这个管道添加的settings.py中

网络爬虫常用库

https://zhuanlan.zhihu.com/p/81944559