scrapy分页抓取网页( 2.正式开始使用scrapystartproject命令创建新的python文件夹文件)

优采云 发布时间: 2022-01-21 00:11

  scrapy分页抓取网页(

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 选择器来选择标签。

  硒也很慢。作为一个网站调试工具,它会加载太多不相关的网页内容。

  请保持良好的爬取礼仪,尊重网站机器人条款,不得高速爬取服务器,不得将爬取的内容用于非法用途,不得侵权。

  学习的路很长,我们鼓励你!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线