断断续续学习了些python的网课,涉及python基础,scrapy框架,django框架,flask框架,elasticsearch,mysql,课程都不尽人意,两个课程相互借鉴了一下,有点小收获。
琢磨着也做点小玩意。
1、scrapy框架爬取网络数据
2、flask搭建简单搜索引擎
3、一些错误处理
scrapy爬取数据
爬过一些网站,目前觉得知乎改版后的爬取有点难。
这里我选择爬取jobbole伯乐在线。
首先看一下scrapy的框架图!(官方标配)
通俗来说就是spider发出请求爬取的url送到scheduler(调度程序:所有的url都会汇总到这里进行迭代),调度程序scheduler将要请求的url经过中间件middleware(可以在此处设置IP池,user-agent池等)发送到下载器downloader下载,结果response返回给spider(在这里可以对数据做操作,但不建议,因为看起来很乱),而item和item pipeline则是对数据进行处理的,其中item.py中定义数据类型以及处理数据函数,管道pipeline.py中做保存操作,比如存入数据库。(切记要在setting文件中给自定义的pipeline注册好)
一、scrapy爬取伯乐在线的文章
# 利用scrapy框架创建爬虫,cmd下
pip install scrapy # 安装包
# 然后cd 到想创建的目录下,创建
scrapy startproject
your spider project name
可以用pychame打开该工程文件,在spiders下创建爬虫逻辑,比如我创建的是jobbole.py
# -*- coding: utf-8 -*-
import scrapy
import datetime
from scrapy.http import Request
from urllib import parse
from ArticleSpider.items import jobboleArticleSpiderItem,JoboleMySqlItem # 自己目录下的文件
import hashlib # 将哈希package引进
# 继承scrapy.Spider
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
# 允许的域名
allowed_domains = ['blog.jobbole.com']
#开始页面
start_urls = ['http://blog.jobbole.com/all-posts/']
#这里我设置一个数值控制爬取的页面数
crawlpage=0
# 必须重载的函数,对数据做处理
def parse(self, response):
# xpath选择器找到自己要选择的元素,据说这样的比beautifulsoup处理速度快
# 取页面下文章节点,后对节点处理
all_post_node = response.xpath("//div[@class = 'post floated-thumb']//div[@class = 'post-thumb']")
# 取下一页地址
next_parse_url = response.xpath('//a[@class = "next page-numbers"]/@href').extract()[0]
# 遍历节点,获取文章url和照片的url
for post_node in all_post_node:
post_url = post_node.xpath('./a/@href').extract_first("")
post_url = parse.urljoin(response.url, post_url) #添上域名,防止只带部分域名的链接
image_url = post_node.xpath('.//a/img/@src').extract_first("")
image_url = parse.urljoin(response.url, image_url) # 添上域名,防止只带部分域名的链接
# yield出去,这是一个迭代器
yield Request(post_url, meta={"front_image_url": image_url}, callback=self.parse_content) #请求到页面后作为参数,callback到函数prase_content
# 下一页url
if next_parse_url:
self.crawlpage=self.crawlpage+1
# 这里只爬取四个3个下一页
if self.crawlpage< 3:
next_parse_url=parse.urljoin(response.url,next_pa