python之爬虫

一.爬虫的基本架构:
1.URL管理模块:
  • 对计划爬取的和已经爬取的URL进行管理,防止重复爬取或循环指向。
  • 功能:
    • 可添加新的URL
    • 管理已爬取的URL和未爬取的URL
    • 获取待爬取的URL
  • 实现方式
    • Python 的set数据结构
    • 数据库中的数据表
2.网页下载模块:
  • 将URL管理模块中指定的URL进行访问下载
  • requests模块
  • requests.get(url)返回response对象
  • response对象
    • status_codes:状态码 (200:请求成功;404:请求的资源不存在;500:内部服务器错误)
    • headers:网页header信息
    • encoding:网页编码(utf-8)
    • text:请求返回的文本信息
    • cotent:以字节形式返回的非文本信息
import requests
url = 'http://www.baidu.com/'
r_obj = requests.get(url)
r_obj.text
r_obj.encoding='utf-8'
3. 网页解析模块:
  • 解析网页下载模块中的URL,处理或保存数据
  • 从已下载的网页中解析所需的内容
  • 实现方式:
    • 字符串匹配:如正则表达
    • html.parser:python 自带的解析html的工具
    • BeautifulSoup:结构化的网页解析

其中BeautifulSoup使用步骤:

  1. 创建BeatifulSoup对象
BeautifulSoup(
 	url,	
	html_parser, 指定解析器
      	encoding 指定编码格式(确保和网页编码格式一致)
      )
  1. 查询节点方式-按节点类型或属性查找
  • find(),找到第一个满足条件的节点
  • find_all(),找到所有满足条件的节点
  • 示例:
    <a href =“text.html”class = “text_link” > next page< /a>
    • 按类型:find_all(‘a’)
    • 按属性:
      * find_all(‘a’,href=‘test.html’)
      * find_all(‘a’,href= ‘test.html’,string =‘next page’)
      * find_all(‘a’,class_=‘test_link’) #加下划线将此处和关键字class区分
代码示例
import requests
from bs4 import BeautifulSoup

url =' https://www.baidu.com/'
r_obj = requests.get(url)
bs = BeautifulSoup(
	r_obj.content,
	'lxml',
	from_encoding = 'utf-8')
bs.find('title')
bs.find_all('a',class_= 'mnav')

结果如下:

在这里插入图片描述
3. 获取节点信息
查询节点返回的是Tag对象,依据Tag对象,获取节点信息
如:<a class =“mnav” href =“http://news.baidu.com” name =“tj_trnews">新闻< /a>

  • Tag.name :节点标签名称,‘a’
  • Tag.attrs:节点的属性,字典类型 {‘class’: [‘mnav’], ‘href’: ‘http://news.baidu.com’, ‘name’: ‘tj_trnews’}
  • Tag.text:获取节点的文本,’新闻‘

获取节点的其他信息:

  • children:只返回“孩子”节点
  • desecdants 返回所有“子孙”节点
  • next_siblings 返回下一个“同辈”节点
  • previous_siblings 返回上一个“同辈”节点
  • parent 返回“父亲”节点
二.Scrapy框架简介
1.高级特性

1.内置数据抽取器CSS/XPath/re
2.交互式控制台用于调试
3.结果输出的格式支持,JSON, CSV, XML等
4.自动处理编码
5.支持自定义扩展

2.使用步骤(基于anaconda)

安装:conda -c froge scrapy
验证安装:scrapy bench

1)cd craw_1688
2)scrapy startproject craw1688 即创建工程
3)定义Itme,构造爬取的对象(可选)
定义item:

  • scrapy.Field()
class CityItem(scrapy.Item):
	city_name =Scrapy.Field()
	city_link = scrapy.Field()

4)编写Spider,爬虫主体
* cd craw1688(项目名称),注意,必须进入项目名称的文件夹后,才能执行下面的命令。
* 执行“scrapy genspider aqi_spider(Spider主体的文件名称) http://www.pm25.in/(需要爬取的网站的url)”生成如下所示:
所有文件均为执行命令生成
简单版:

以下为简单的爬虫主题,修改后的代码如下:
import scrapy
class AqiSpider(scrapy.Spider):
    name = 'aqi_spider'
    allowed_domains = ['http://www.pm25.in/']
    start_urls = ['http://www.pm25.in/']

    def parse(self,reponse):
        print('=======')
        print('type:',type(reponse))
        print('status:',reponse.status)
        print('body:')
        print(reponse.body)
        print('==============')

4.2 编写spider

  • 使用BeautifulSoup解析网页内容
  • 调用自定义的Item
import scrapy
from bs4 import BeautifulSoup
from craw1688.items import CityItem

class AqiSpider(scrapy.Spider):
    name = 'aqi_spider'
    allowed_domains = ['http://www.pm25.in/']
    start_urls = ['http://www.pm25.in/']

    def parse(self,reponse):
        bs =BeautifulSoup(reponse.body,'lmxl')
        div_obj = bs.find('div',class_='all')
        li_tag_list = div_obj.find_all('li')

        for li_tag in li_tag_list:
            city_item=CityItem()
            city_item['city_name'] =li_tag.find('a').text
            city_item['city_link'] =li_tag.find('a')['href']

        yield city_item #多次迭代
            

5)编写配置和Pipeline,用于处理爬取的结果(可选)

  • 目的:处理解析的Item,如结果保存为CSV文件
  • 在seetings.py中配置
ITEM_PIPELINES = {
 'craw1688.pipelines.CityItemPipeline': 300,#数值代表优先度
}

  • 添加open_spider()函数,close_spider()函数
from scrapy.exporters import CsvItemExporter
class CityItemPipeline(object):
    def open_spider(self,spider):
        self.file=open('cities.csv','wb')
        self.exporter=CsvItemExporter(self.file)
        self.exporter.start_exporting()

    def process_item(self,item,spider):
        self.exporter.export_item(item)
        return item

    def close_spider(self,spider):
        self.exporter.finish_exporting()
        self.file.close()

6)执行爬虫
* scrapy crawl aqi_spider(需要和Spider主体的文件名称一致)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值