欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬虫----scrapy框架使用

程序员文章站 2022-05-06 20:32:14
...

1.起项目(cmd)
 爬取图片,项目名称So,爬虫程序so.py
 url链接:http://image.so.com/zj?ch=beauty&sn=90&listtype=new&temp=1

  • scrapy startproject So
  • cd So
  • scrapy genspider so image.so.com   #爬虫程序名和目标域名

2.管道文件 items.py
 定义要爬取的数据结构

class SoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 图片链接
    imgLink = scrapy.Field()

3.爬虫程序 so.py
关于start_requests()的说明:该方法scrapy框架已写好,爬虫程序从该方法开始执行,将start_urls发给调度器,并指定回调函数为parse函数,parse函数将页面解析后将item对象发给管道,此处对该方法进行了重写,并指定了其他解析函数

import json, scrapy
from urllib import parse
from So.items import SoItem

class SoSpider(scrapy.Spider):
    name = 'so'
    # 允许爬取的域名
    allowed_domains = ['http://image.so.com']
    # start_urls = ['http://image.so.com/zj?ch=beauty&sn=90&listtype=new&temp=1']
    baseurl = 'http://image.so.com/zj?'

    # 重写start_requests()方法
    def start_requests(self):
        # 拼接url地址
        for page in range(3):
            params = {
                'ch': 'beauty',
                'sn': str(page*30),
                'listtype': 'new',
                'temp': '1'
            }
            # 拼接成一个完整的url地址
            url = self.baseurl + parse.urlencode(params)
            # 将完整的url地址发给调度器,并指定回调函数
            yield scrapy.Request(url,callback=self.parseImg)

    def parse(self, response):
        pass

    def parseImg(self,response):
        # 创建管道对象
        item = SoItem()
        # 获取响应的文本内容(此项目链接返回的是json)
        html = response.text
        # 将json转为字典
        d = json.loads(html)
        # 直接遍历字典中list键对应的列表,列表中为字典
        for img in d['list']:
            item['imgLink'] = img['qhimg_url']
            yield item

补充一个文本信息的爬虫程序
scrapy中xpath提取出的是选择器对象的列表
response.xpath(’’) >>>> 结果 :[<selector … data=‘文本内容’>,<…>]
可通过extract()方法获取选择器对象中的文本内容
response.xpath(’’).extract() >>>> 结果 :[‘文本内容1’,‘文本内容2’,…]

import scrapy
from Tengxun.items import TengxunItem

class TengxunSpider(scrapy.Spider):
    name = 'tengxun'
    allowed_domains = ['hr.tencent.com']
    start_urls = ['https://hr.tencent.com/position.php?start=0']
    baseurl = 'https://hr.tencent.com/position.php?start='

    #start_urls访问后会返回给parse函数,后续则返回给指定的回调函数
    def parse(self, response):
        # 把要爬取的url地址交给调度器,重复的链接调度器将不再安排下载
        for page in range(0,3120,10):
            url = self.baseurl + str(page)
            # 交给调度器,并指定解析函数
            yield scrapy.Request(url,callback=self.getHtml)

    def getHtml(self,response):
        item = TengxunItem()
        # 用xpath解析页面,获得选择器对象的列表
        baseList = response.xpath('//tr[@class="even"] | //tr[@class="odd"]')
        for base in baseList:
        	# 通过extract()方法获取选择器对象中的文本内容
            item['zhName'] = base.xpath('./td[1]/a/text()')[0].extract()
            item['zhType'] = base.xpath('./td[2]/text()')
            if item['zhType']:
                item['zhType'] = item['zhType'][0].extract()
            else:
                item['zhType'] = '无'
            item['zhNum'] = base.xpath('./td[3]/text()')[0].extract()
            item['zhAddress'] = base.xpath('./td[4]/text()')[0].extract()
            item['zhTime'] = base.xpath('./td[5]/text()')[0].extract()
            item['zhLink'] = base.xpath('./td[1]/a/@href')[0].extract()
            yield item

4.管道文件 pipelines.py

#导入scrapy的图片管道类
from scrapy.pipelines.images import ImagesPipeline
import scrapy

# 继承自ImagesPipeline
class SoPipeline(ImagesPipeline):
    # 重写ImgesPipeline的方法
    def get_media_requests(self, item, info):
        # 将链接发给调度器入队列,调度器会将图片保存到settings.py中的
        # IMAGES_STORE 变量的路径中
        yield scrapy.Request(item['imgLink'])

补充一个管道文件

import pymongo
# 导入settings文件中关于数据库的配置信息
from .settings import *

class TengxunPipeline(object):
    def __init__(self):
    	# 初始化数据库配置
        self.conn = pymongo.MongoClient(MONGO_HOST,MONGO_PORT)
        self.db = self.conn['tengxundb']
        self.myset = self.db['tengxunPost']
	
	# 此方法名固定写法
    def process_item(self, item, spider):
        d = dict(item)
        self.myset.insert_one(d)
        # 必须返回item,可供其他管道继续使用
        return item

5.修改配置 settings.py

# 取消robots协议
ROBOTSTXT_OBEY = False

# 设置线程数,默认16
#CONCURRENT_REQUESTS = 32

# 开启默认请求头,需要大量User-Agent时可单独设置
DEFAULT_REQUEST_HEADERS = {
  'User-Agent': 'Mozilla/5.0',
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
}

# 开启项目管道
ITEM_PIPELINES = {
   'So.pipelines.SoPipeline': 300,
}

# 图片的存储路径
IMAGES_STORE =  'C:\\Users\\Administrator\\Desktop\\AID1810\\code\\17spider\\day08\\images'

6.项目启动:创建begin.py(和scrapy.cfg文件同目录)

from scrapy import cmdline

cmdline.execute('scrapy crawl so'.split())