了解了scrapy的基本架构之后,会发现,没有实战好像并不是懂它的原理,想要写一个爬虫尚且还是有点问题。
下面介绍一下它的基本写法,在settings.py中设置配置文件,在里面主要写的是并发数,和延迟下载,以及请求头部的信息
起到了全局调用的效果。
middlewares中间件,这里面的代码可以删除,设置代理ip和随机的请求头,因为爬虫每次访问网站之前都会路过这个类,经过筛选好的ip就可以实现功能了。在下载器中间件里面有个方法为process_request(self,request,spider),这个方法中的代码会排队等待访问网页,在scrapy见到request应该要想到排队,看到item容器要想到pipelines管道文件。
最重要的就是spiders,那么这里面应该怎样写呢,我认为,不应拘束自己的思维,按照自己的想法写,有yield就是生成器,我们可以对他进行调用,最近写的时候我也感觉有些迷茫
import scrapy
import re
from first.items import FirstItem
import ssl
class MeishiSpider(scrapy.Spider):
name = 'meishi'
allowed_domains = ['meituan.com']
start_urls = ['http://meituan.com/']
def start_requests(self):
pages =[]
for i in range(1,3):
print(i)
url = "https://xt.meituan.com/meishi/pn"+str(i)+"/"
# page = scrapy.Request(url)
pages.append(url)
for url in pages:
yield scrapy.Request(url=url,callback=self.parse_index)
def parse_index(self, response):
data = response.text
pat = '"poiId":(.*?),"frontImg"'
pat1 = '{"itemId":"(.*?)","title"'
poid = re.findall(pat,data)
itemId = re.findall(pat1,data)
if len(poid) != 0:
Id = poid
Id = itemId
print(Id)
for i in range(len(Id)):
pageurl = "https://www.meituan.com/meishi/"+str(Id[i])+"/"
yield scrapy.Request(url=pageurl,callback=self.parse_detail)
def parse_detail(self,response):
item = FirstItem()
data = response.text
pat2 = '"phone":"(.*?)","openTime'
pat3 = '"name":"(.*?)","avgScore"'
pat4 = '"address":"(.*?)","phone":'
phone = re.findall(pat2, data)
name = re.findall(pat3, data)
address = re.findall(pat4, data)
item['name'] = name
item['phone'] = phone
item['address'] = address
yield item
当我使用芝麻代理来访问这个的时候就会出现一些问题,好像是因为parse这个方法。
day2 2019 9/8 整理的好乱,但是还是要坚持写,加油!