Python Scrapy爬虫(下)
一、在Pycharm中运行Scrapy爬虫项目的基本操作
1、Pycharm安装好Scrapy模块:scrapy的安装之前需要安装这个模块:方案一:lxml->zope.interface->pyopenssl->twisted->scrapy。方案二:wheel(安装.whl文件)、lxml(lxml是用来做xpath提取)、Twisted、pywin32。
2、通过pycharm创建scrapy项目:pycharm不能直接创建scrapy项目,必须通过命令行创建。在Pycharm的Terminal终端,cd命令指定文件,然后通过命令:scrapy startproject scrapyspider,创建名为scrapyspider的scrapy项目。
3、通过cmd创建scrapy项目:设置环境变量path,增加scrapy.exe的所在文件夹的路径。cd命令指定文件,然后通过命令:scrapy startproject scrapyspider,创建名为scrapyspider的scrapy项目。
二、scrapyspider目录
scrapyspider/ scrapy.cfg scrapyspider/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py ...
1、目录下各个文件:
- crapy.cfg: 项目的配置文件。
- scrapyspider/: 该项目的python模块。之后您将在此加入代码。
- scrapyspider/items.py: 项目中的item文件。
- scrapyspider/pipelines.py: 项目中的pipelines文件。
- scrapyspider/settings.py: 项目的设置文件。
- scrapyspider/spiders/: 放置spider代码的目录
三、编写scrapy框架中需要编写的spider、Item 、pipelline的代码
1、Item 部分代码:容器(items)的定义,容器不一定是一开始全部都定义好的,可以跟随项目的更新一点点向里面添加。
注:网页收集信息包含多种类型时,需要为每种类型的数据定义单独的 class
import scrapy
class TutorialItem(scrapy.Item): # 创建一个类,继承scrapy.item类,就是继承人家写好的容器
# define the fields for your item here like:
# name = scrapy.Field()
movieid = scrapy.Field()
moviename = scrapy.Field()
directors = scrapy.Field()
actors = scrapy.Field()
posterPath = scrapy.Field()
plotSummary = scrapy.Field()
averageratings = scrapy.Field()
numRatings = scrapy.Field()
2、spider部分代码:用户编写用于从单个网站(或者一些网站)爬取数据的类。
1、创建一个Spider,您必须继承 scrapy.spiders.Spider 类
from scrapy.spiders import Spider
2、根据需求定义属性和方法:
2.1、name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字
2.2、start_urls: 包含了Spider在启动时进行爬取的url列表
2.3、def parse() 方法:方法被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response.data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象
2.4、可以根据需求定义其他方法:def start_requests、def make_requests_from_url、def update_settings、def handles_request、def close等。
2.5、读取配置文件setting.py的方法:
由原来的:from scrapy.conf import settings,改成“装饰器方法”:from scrapy.utils.project import get_project_settings;settings = get_project_settings()
设置name、start_urls和一些变量:
name = "demo" movie_id = 1 #handle_httpstatus_list = [401] allowed_domains = ["movielens.org"] start_urls = ["https://movielens.org/api/movies/"]
def parse() 方法:
def parse(self, response): #filename = response.url.split("/")[-2] #filename = "movies" #with open(filename, 'ab') as f: # f.write(response.body) item = MovieItem() entity = json.loads(response.body) movie = entity['data']['movieDetails']['movie'] item['movieid']= entity['data']['movieDetails']['movieId'] item['moviename'] = movie['title'] item['directors'] = ",".join(movie['directors']) item['actors'] = ",".join(movie['actors']) item['posterPath'] = movie['posterPath'] item['plotSummary'] = movie['plotSummary'] item['averageratings'] = movie['avgRating'] item['numRatings'] = movie['numRatings'] yield item while self.movie_id<140215: self.movie_id += 1 url = self.start_urls[0]+str(self.movie_id) yield scrapy.Request(url, dont_filter=True, callback=self.parse)
3、pipelline部分代码,持久化实体
import json from tutorial.items import MovieItem class TutorialPipeline(object): def __init__(self): self.conn = mysql.connector.connect(user='root', password='123456', database='how2java') self.cursor = self.conn.cursor() def process_item(self, item, spider): insert_sql = """ insert into movie(movieid, moviename, directors, actors, posterPath, plotSummary, averageratings, numRatings) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) """ self.cursor.execute(insert_sql, ( item["movieid"], item["moviename"], item["directors"], item["actors"], item["posterPath"], item["plotSummary"], item["averageratings"], item["numRatings"])) self.conn.commit()
四、爬虫常用的命令
2、进入项目:cd xxx #进入某个文件夹下
3、创建爬虫:scrapy genspider xxx(爬虫名) xxx.com (爬取域)
4、输出item:scrapy crawl xxx -o xxx.json -t json (生成名称xxx.json的json 文件);CSV、XML等!或者在解析函数里增加适当的代码将item对象写入文件或数据库.
5、运行爬虫:scrapy crawl XXX
6、列出所有爬虫:scrapy list
7、获得配置信息:scrapy settings [options]
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Scrapy爬虫(下) - Python技术站