scrapy分页抓取网页( 2.正式开始使用scrapystartproject命令创建新的python文件夹文件)
优采云 发布时间: 2022-01-21 00:11scrapy分页抓取网页(
2.正式开始使用scrapystartproject命令创建新的python文件夹文件)
pip install scrapy
2. 在终端使用scrapy startproject命令新建一个scrapy文件夹
scrapy startproject myspider
在项目文件夹中,scrapy 已经自带了几个 python 文件,包括:
由此可见,scrapy将请求的功能分开,封装到不同的文件中,自动化程度更高。
3. 现在正式开始使用scrapy。首先,在Item中命名你要抓取的内容。
class MySpiderItem(scrapy.Item):
title = scrapy.Field() # sample code
contents = scrapy.Field()
pass
4. 接下来,在 spiders 文件夹中创建一个新的 python 文件,例如 myspider,py。从这里开始写爬虫。
给爬虫起名字:
class MySpider(scrapy.Spider):
name = "myspider"
然后,如果它从一个或多个 URL 开始往下爬,写 start_urls(这是一个 list[])。
class MySpider(scrapy.Spider):
name = "myspider"
start_urls = ["url"]
假设我一共要爬5个页面,每个页面有几个链接,最终的目标是爬取5个页面上每个链接的内容。
我想避免手动编写列表,并使用 for 循环来形成起始 URL(就像请求一样)。所以,
page = 5
class MySpider(scrapy.Spider):
name = "myspider"
bash_url = url
def start_requests(self):
for i in (1, page+1):
url = self.base_url + str(i)
yield Request(url, self.parse)
这里最后一行的yield会继续抛出Request()对当前url的解析内容(也就是response),然后使用回调函数传入parse方法。
接下来我们看一下parse方法。然后写下来。
def parse(self, response):
atags = BeautifulSoup(response.text, 'lxml').find_all('a', {'class':'name'})
urls = [l['href'] for l in atags]
for url in urls:
yield Request(url, callback=self.get_content)
现在,parse 首先使用 BeautifulSoup 来分析传入的网页内容。首先提取页面上所有符合条件的标签。然后使用此语句提取标签内的 url。
urls = [l['href'] for l in atags]
现在我们已经在一个页面上提取了所有符合条件的 url。对于每个 url,我们继续使用 yield 抛出 Request() 来解析这些新的 url,然后将其传递给 next 方法 get_content() 以捕获新页面的内容。
下面是 get_content() 方法的示例。
def get_content(self, response):
soup = BeautifulSoup(response.text, 'lxml')
item = ScrapyTeaItem()
item['title'] = soup.find('p', {'class':'family'}).get_text()
item['contents'] = soup.find('p', {'class':'name'}).get_text()
return item
看到这里,myspider.py 终于接触到了 items.py。至此,爬虫已经爬取了五个网页上所有链接页面的内容,并将爬取的内容输入到item中。
5. 现在我们可以打开管道来存储项目的内容。但是,要启用管道功能,我们必须首先打开 settings.py 文件并删除 ITEM_PIPELINES = { 之前的#注释。
回到管道文件。将爬取的网页内容写入本地txt文件的代码如下。
class MySpiderPipeline(object):
def process_item(self, item, spider):
with open('myspider.txt', 'a', encoding='utf-8') as f: # "a" for append mode
f.write('\n'+ item['title'] + '\n') # one line
f.writelines(item['contents']) # multiple lines
return item
这样,保存网页内容的代码也写好了。
6. 如果要控制爬取速度,在设置中设置:
7. 现在开始运行我们编写的爬虫。在终端输入scrapy crawl myspider运行,创建的txt文档会保存在本项目的根目录下。
至此,scrapy爬虫已经编写成功!
刮云
scrapy还提供了云爬虫服务,免费用户一次可以运行一个爬虫。
注册/scrapy-cloud
2. 点击 CREATE PROJECT 并输入项目名称
3. 进入Deploy Management页面,命令行使用终端将本地项目传输到云端
4. 在本地项目文件夹的终端中(使用终端中的 cd 和 cd... 命令前进或后退文件夹),运行代码。
pip install shub
安装完成后,运行
shub login
提示API KEY,在云端页面输入API key
然后使用如下语句将本地项目推送到云端
shub deploy #加上云端页面上的id号码
如果使用BeautifulSoup,会报bs4包不支持的错误
任何不受支持的软件包的解决方案是:
一个名为 scrapinghub.yml 的新文件已在本地自动创建。打开此文件并将其添加到项目下。
project:
requirements:
file: requirements.txt
2. 在本项目根目录下创建文本文件requirements.txt(即与scrapinghub.yml同级)
3. 打开 requirements.txt,将问题包的名称和版本写成如下格式。
beautifulsoup4==4.7.1
4. 要查看软件包的特定版本,请在终端中键入 pip show。例如。
pip show beautifulsoup4
5. 保存所有文件并在终端中再次推送项目。
shub deploy
这次应该成功了!
在云端运行爬虫:在项目页面选择运行。
注意:
由于内容篇幅,本文在代码开头没有提及需要加载的python包。实际操作中,如果没有加载对应的包,python会报错。
BeautifulSoup 中用于抓取网页内容的标签只是示例。不同的网站请使用浏览器的View Source 和Inspect 功能查看具体的标签。
bs4 运行缓慢,高级选择建议使用 xpath 或 scrapy 选择器来选择标签。
硒也很慢。作为一个网站调试工具,它会加载太多不相关的网页内容。
请保持良好的爬取礼仪,尊重网站机器人条款,不得高速爬取服务器,不得将爬取的内容用于非法用途,不得侵权。
学习的路很长,我们鼓励你!