运行环境和开发环境搭建好了,scrapy的基本运行流程也有了基本了解以后,我们会有个疑问?如何让schedule组件知道我需要爬取的网站的网址了?我们需做的是给scrapy一个爬取的目标。
使用vscode打开创建的工程(工程创建方法:https://blog.csdn.net/huyongchao98/article/details/103909481 不了解scrapy的同学,请从https://blog.csdn.net/huyongchao98/article/details/103909153开始阅读)。
在工程目录下找到spiders路径,在这里可以创建一个.py文件,文件名自己定义,作为爬虫开始工作的入口。创建一个类,类名自己定义,类需要继承scrapy.Spider,类的基本结构如下:
(1)需要定义的基本属性:
name: 爬虫的名称,执行 scrapy crawl <spider_name>的时候,需要一致
allowed_domains: 整个爬取周期中,允许爬取的domain,如 baidu.com 你就可以爬取a.baidu.com等二级域名了。
start_urls: 这个属性指定了爬取网站的url,也就是爬取的入口网站,可以是多个,也就是scrapy的爬取目标。也可以不通过属性指定通过start_requests方法,也可以实现相同的目的。
(2)基本的方法:
start_requests(self): 开始的请求,返回一个或多个异步的request,可以达到指定scrapy网站爬取入口的目的。
一些其他的技巧:
(1)传递参数:有时候爬取网站的时候,需要添加一些外部参数,比如爬取的页码、搜索的关键字等,需要在爬虫运行的时候,由外部指定参数,这是我们可以在运行scrapy crawl命令的时候,通过-a来添加参数,如:
scrapy crawl testSpider -a parameter=a
在spider类中,添加对应的初始化方法,可以获取到对应的参数,上面的这条命令,对应的初始化方法是:
def __init__(self, parameter=None, *args, **kwargs):
一个完整的spider例子如下:
import scrapy
import urllib.parse
class testSpider(scrapy.Spider):
name = 'maimaiSpider'
allowed_domains = ['test.cn']
def start_requests(self):
feed = 'https://test.cn/web/search_center?type=dsfa&query=' + urllib.parse.quote(
self.companyname) + '&highlight=true'
urls = [
'https://acc.test.cn/login',
'https://test.cn/feed_list',
feed,
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def __init__(self, companyname=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.companyname = companyname
driver = None # 实例selenium
cookies = None # 用来保存cookie
def parse(self, response):
print(response.url)
print(response.body.decode('utf-8'))