渣渣的自述--文章网站爬取 python爬虫(1)

题记:

python学了个半溜子,进攻爬虫学习的时候,遇到了很多阻碍。可以说是一边学习python的语法特性、常用实战操作,一边学习爬虫。刚开始的时候特别吃力,尤其记得刚开始scrapy进行虚拟环境配置的时候,碰到了很多麻烦,全是自己从没有碰到过的东西【那时候多么想有个人来指导我啊T__T】,但是最终还是都解决了。  在后面的学习过程中,依旧是很吃力【ORZ】,然后把爬虫学习就搁置了,之后自己开始自学Java【话说自己怎么辣么喜欢自学呢~~】,同时开始刷leetcode,又学习了《编程方法学》这门以java语言为主的公开课,记了17,000+字的笔记,准备在以后把笔记也整理成一个专栏,毕竟对于自学党,对于新手是一个很好的帮助,里面提及了许多很多帮助的思想。 那本该死的《Java编程思想》 前十章已经开始第二遍了,也准备将上面的重点整理上来。 开学之后的《Java虚拟机》还要学习,想想就很恶心。

经历了这些恶心的过程,然后寒假开始的时候拾起来爬虫,发现拨雾见明,python作为脚本语言,和Java这种OOP语言有几分相似之处【作为一个初初初学者是这么认为的】,很多思想很相像,在爬虫的进一步学习过程中,发现不仅仅是一门技术的学习,其中很多解决问题的思路都是共用的。

下面仅仅是将自己学习过程的思路理一遍,再将其中重要的思想理一理,大致顺序为  自己随心所欲的 顺序,所以不能作为一个教程,仅仅为自娱自乐而已。


一、爬虫的启动:

在工程项目中新建一个 .py 文件

代码如下:

from scrapy.cmdline import execute

import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy","crawl","jobbole"])


知识点(1):相对路径

scrapy crawl jobbole这个命令需要在工程下运行,所以我们需要将工程路径进行添加,为了可移植性,我们需要添加相对路径,通

import os 模块,使用 os.path.abspath(__file__)找到main文件当前路径,然后通过 os.path.dirname()找到父目录,再通过sys.

path.append()函数进行添加即可。

知识点(2):启动爬虫

再cmdline包中,有execute函数,注意execute函数的使用,是列表中三个字符串的组合。


二、爬虫文件

我们得明确scrapy是一个框架,这个框架提供了很多便利的地方。其中 spider文件夹中存放具体的爬虫项目,有一个具体的模板,我们可以通过再虚拟环境下进入项目工程,通过 cmd 命令 scrapy genspider [此处为文件名] [此处为域名] 来创建一个模板,也可以自己手动创建,这个模板如下:

import scrapy

class JobboleSpider(scrapy.Spider):
    name = 'jobbole'
    allowed_domains = ['blog.jobbole.com']
    start_urls = ['http://blog.jobbole.com/all-posts/']


变量: name, allowed_domians, start_urls, 有与之对应的东东


之后是parse函数,进行解析。 通过css 或者 xpath进行提取具体字段,所以css选择器的只是还是要具备的。

def parse(self, response):  可见这个函数里面,传入的是response, response我们可以理解为是一个对start_urls进行一个下载后,获取url页面具体信息的一个集合,我们要对这个大集合里的内容进行提取分析。

post_nodes = response.css("#archive .floated-thumb .post-thumb a")
for post_node in post_nodes:
    image_url = post_node.css("img::attr(src)").extract_first("")
    post_url = post_node.css("::attr(href)").extract_first("")
    yield Request(url=parse.urljoin(response.url,post_url),meta = {"front_image_url":image_url},callback=self.parse_detail)
#获取下一页的url并交给scrapy进行下载
next_url = response.css(".next.page-numbers::attr(href)").extract_first("")
if next_url:
    yield Request(url=parse.urljoin(response.url,next_url),callback=self.parse)


这一段代码详细解释了我们爬取信息的逻辑:

1.通过获取文章全部列表的css选择器,然后开始进行迭代,

2.每一次迭代到详细的文章的url,再进行进一步文章封面和文章具体url的获取,交给Request函数,yield进行下载。

3.获取下一页的url,存在的话,进行下载,并重复上面操作。

注意点(1):Request函数的参数中,callback赋值的时候注意带上self. 

注意点(2):第一个Request中的meta,是处理图片专用的,后面再提到



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值