工作需要,临时学习一下Python,记录一些学习资料和经验
python3语言入门
python3环境
爬虫快速入门
第一步:Get获取网页html
第二步:根据html界面规则,定位提取自己想要的数据
入门实战:使用requests和beautifulsoup4从小说网站爬取并保存小说
需要安装的库:
python库 | 作用 | cmd安装命令 | 文档 |
requests | 发送网络HTTP请求 | pip install requests | |
beautifulsoup4 | 从HTML或XML文件中提取数据 | pip install beautifulsoup4 |
爬虫框架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 startproject MovieSpider - 创建爬虫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 | 开发者定义的蜘蛛,开发者在这里设置请求地址和解析数据的规则。 |
- Item.py定义属性
import scrapy
class MoviespiderItem(scrapy.Item):
#电影名
name = scrapy.Field()
#uri
uri = scrapy.Field()
- 编写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
- pipelines.py处理Item输出
class MoviespiderPipeline(object):
def process_item(self, item, spider):
print("name:",item['name'])
print("url:",item['url']) #这里就打印出来
- 修改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,
}
- 运行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
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