• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

初学Scrapy

武飞扬头像
招财财猫
帮助1

1、items.py   像字典一样

定义所爬取信息的名字,相当于规定好要提取信息的Key键

2.spiders包中  用来请求和解析 

默认起始爬取链接、request请求、def parse()解析函数

(可以重定义request,修改url、请求头、cookies)

返回url需要再回调解析函数,最终爬取的信息,作为参数传递给items,封装成类似字典,进入管道

3、pipelines.py 下载和保存所提取的信息

open函数,写入文件

4、settings.py   开启管道、cookies、robot协议等开关

一、创建项目和项目文件,运行项目

cmd命令行中输入

1.创建项目:

scrapy startproject 项目名字

切换到项目目录下

2.创建项目文件:

scrapy genspider 文件名  爬取的目标主域名

学新通

 3.运行项目

命令行中输入和创建main.py文件都可以

main.py

  1.  
    from scrapy import cmdline
  2.  
     
  3.  
    cmdline.execute('scrapy crawl fofa'.split())
  4.  
     
  5.  
    # 加.split()分隔下 'scrapy crawl fofa'会有空格,避免输入错误,也是支持运行的

二、所需信息名字,封装到items中

把需要信息的类别名字封成类似字典容器一样,相当于以后爬取信息的标头Key键

items.py

  1.  
    import scrapy
  2.  
     
  3.  
     
  4.  
    class SqUrlItem(scrapy.Item):
  5.  
     
  6.  
    urls=scrapy.Field()
  7.  
    ips=scrapy.Field()

三、自定义request请求头和cookies,多页爬取

spiders包中,项目文件.py

  1.  
    import scrapy
  2.  
    from fake_useragent import UserAgent
  3.  
    from ..items import SqUrlItem
  4.  
     
  5.  
    class FofaSpider(scrapy.Spider):
  6.  
     
  7.  
    # 作为启动时候的名字,唯一性
  8.  
    name = 'fofa'
  9.  
    # 允许爬取的主域名
  10.  
    allowed_domains = ['fofa.info']
  11.  
    # 启动的初始连接,后期如果重写request请求这个就不管用了
  12.  
    # start_urls = ['http://fofa.info/']
  13.  
     
  14.  
    # 自定义的请求头,cookies需要单独拿出来
  15.  
    headers = {
  16.  
    'Accept': ''
  17.  
    'Accept-Encoding': '',
  18.  
    'Accept-Language': '',
  19.  
    'Cache-Control': '',
  20.  
    'Connection': '',
  21.  
    'Host': '',
  22.  
    'If-None-Match': '""',
  23.  
    'Referer': '/',
  24.  
    'Sec-Fetch-Dest': 'dt',
  25.  
    'Sec-Fetch-Mode': 'n',
  26.  
    'Sec-Fetch-Site': n',
  27.  
    'Sec-Fetch-User': '',
  28.  
    'Upgrade-Insecure-Requests': '',
  29.  
    'User-Agent': str(UserAgent().Chrome),
  30.  
    'sec-ch-ua': '"Google Chro',
  31.  
    'sec-ch-ua-mobile': '',
  32.  
    'sec-ch-ua-platform': '"Wi"'}
  33.  
     
  34.  
     
  35.  
    # 自定义cookies 需要去setting开启 ‘COOKIES_ENABLED = True’
  36.  
    cookies = {'9b7bd7f2f5cf989': '16241',
  37.  
    '_cd': 'rsHRaus34',
  38.  
    'befuter': '%F',
  39.  
    'user': D',
  40.  
    'baseShowChange': 'false',
  41.  
    'f57f67dfb76eedcf989': '17876576'
  42.  
    }
  43.  
     
  44.  
     
  45.  
    # 多页爬取,相同部分的链接
  46.  
    base_url='https://fofa.info/rqbG9mIGNvdW50D&page='
  47.  
    # 变动的是page页面数字
  48.  
    page=1
  49.  
     
  50.  
    # 重写requests函数
  51.  
    def start_requests(self):
  52.  
    url = 'https://fofa.info/result?qbmIGNvd=&page=1&page_=20'
  53.  
     
  54.  
    # 默认自动请求回来的回应,进入parse()函数去解析,当然也可以自己重新定义回调函数callback=下一步的函数
  55.  
    return [scrapy.FormRequest(url=url, headers=self.headers, cookies=self.cookies)]
  56.  
     
  57.  
    # 相当于解析器,用xpath和css都可以,解析器返回的是列表形式
  58.  
    def parse(self, response):
  59.  
    # 先提出出来一组相同框架的元素
  60.  
    show_list = response.xpath('//div[@class="showListsContainer"]//div[@class="result-item"]')
  61.  
     
  62.  
    # 遍历后,从框架中,定位所需要的信息,extract()是提取里面的data元素是个列表,extract_first是提取的第一个是字符串
  63.  
    for show in show_list:
  64.  
    # 提取a标签下的href属性文本
  65.  
    urls = show.xpath('.//div[@class="aeft"]//span[2]/a/@href').extract_first()
  66.  
    # 提取的a标签下的文本
  67.  
    ips = show.xpath('.//div[@class="innontLeft"]/p[2]/a/text()').extract_first()
  68.  
     
  69.  
    # 爬取的信息去items文件中加工成类似字典形式,作为参数,创建items文件中类对象
  70.  
    urls_ips = SqUrlItem(urls=urls, ips=ips)
  71.  
     
  72.  
    # yield相当于出来一个对象返回出去,进入pipelines管道中
  73.  
    yield urls_ips
  74.  
     
  75.  
    # 多页爬取,设置的是页码,第一页已经爬取了,去掉第一页
  76.  
    if self.page<24:
  77.  
    self.page = 1
  78.  
     
  79.  
    # 拼接剩下页码的url
  80.  
    url_page=self.base_url str(self.page) '&page_=20'
  81.  
     
  82.  
    # 一个个新的url再去请求,再回调parse解析去,最终爬取的信息以items对象进入了管道
  83.  
    yield scrapy.Request(url=url_page,headers=self.headers,cookies=self.cookies,callback=self.parse)
  84.  
     
学新通

post 请求

学新通

链接提取(多页)

有些网站不显示多少页,隐藏页数

学新通

 定位链接元素学新通

1. 用正则提取,代码如下

  1.  
    # 匹配每页符合这个规则元素,自动提取成链接,follow参数关闭只是提取的当前匹配共13页
  2.  
     
  3.  
    打开,是跟踪所有的链接
  4.  
     
  5.  
     
  6.  
    allowed_domains = ['www.dushu.com']
  7.  
    start_urls = ['https://www.dushu.com/book/1188_1.html']
  8.  
     
  9.  
     
  10.  
    rules = (
  11.  
    Rule(LinkExtractor(allow=r'/book/1188_\d .html'), callback='parse_item', follow=True),
  12.  
    )
  13.  
     
  14.  
    # 结尾加‘,’

还可以在建立项目文件的时候,多添加,-t crawl 自动生成包含rules框架文件

学新通

 学新通

2. 使用xpath提取链接

3.使用css提取链接

多层爬取案例:

1.从第一层解析器函数中,返回第二层的url继续解析第二层

2.mata参数,用于封装第一层爬取的信息,传递到第二层,所有的信息再一起创建Items对象

给管道去下载

  1.  
    class DbSpider(scrapy.Spider):
  2.  
    name = 'db'
  3.  
    allowed_domains = ['www.exploit-db.com']
  4.  
    start_urls = ['http://www.exploit-db.com/']
  5.  
     
  6.  
    headers = {'User-Agent': str(UserAgent().Chrome),
  7.  
    'referer': '',
  8.  
    'accept': '',
  9.  
    'x-requested-with': ''
  10.  
    }
  11.  
     
  12.  
    def start_requests(self):
  13.  
     
  14.  
    url=''
  15.  
    return [scrapy.FormRequest(url=url,headers=self.headers)]
  16.  
     
  17.  
     
  18.  
     
  19.  
    def parse(self, response):
  20.  
     
  21.  
    # 返回的是json文件
  22.  
    re_js=json.loads(response.text)
  23.  
     
  24.  
    re_datas=re_js['data']
  25.  
    for i in range(10):
  26.  
    re_data=re_datas[i]
  27.  
     
  28.  
    # 取到的是字符串中带标签
  29.  
    Titles_dict=re_data['url_title']
  30.  
     
  31.  
    # 将字符串标签解析成html,取文本
  32.  
    Titles=BeautifulSoup(Titles_dict,'lxml').text
  33.  
     
  34.  
    Ids=re_data['id']
  35.  
    Categorys=re_data['category']['cat_title']
  36.  
    Dates=re_data['date']
  37.  
     
  38.  
    # 第二层的url
  39.  
    # 拿到第二层的连接需要继续解析
  40.  
    url2='https:' Ids
  41.  
     
  42.  
    meta={'Titles':Titles,'Ids':Ids,'Categorys':Categorys,'Dates':Dates}
  43.  
    # 继续发出请求,回调函数中,去解析第二层需要的元素
  44.  
    yield scrapy.Request(url=url2,headers=self.headers,callback=self.parse_se,meta=meta)
  45.  
     
  46.  
     
  47.  
     
  48.  
    def parse_se(self,response):
  49.  
     
  50.  
    # 拿到第二层所需要的信息
  51.  
    Codes=response.css('.card pre>code::text').extract_first()
  52.  
     
  53.  
    # 将第一层的信息,通过meta参数传递过来,再创建items封装,传到管道
  54.  
    Titles = response.meta['Titles']
  55.  
    Ids=response.meta['Ids']
  56.  
    Categorys = response.meta['Categorys']
  57.  
    Dates = response.meta['Dates']
  58.  
     
  59.  
    ghdb=GhdbItem(Titles=Titles,Ids=Ids,Categorys=Categorys,Dates=Dates,Codes=Codes)
  60.  
     
  61.  
    yield ghdb
学新通

三、进入管道保存信息

pipelines.py

先去settings文件中打开管道

1.存放在csv格式文件中

  1.  
    class SqUrlPipeline:
  2.  
    # 开始爬取自动调取的函数
  3.  
    def open_spider(self,spider):
  4.  
    # 数据去重下
  5.  
    self.id=set()
  6.  
     
  7.  
    self.f=open('url_ip_jp.csv','a',encoding='utf-8')
  8.  
     
  9.  
     
  10.  
    def process_item(self, item, spider):
  11.  
     
  12.  
    if item['name']in self.id:
  13.  
    raise DropItem(f"丢弃{item}")
  14.  
    else:
  15.  
    self.id.add(item['name'])
  16.  
     
  17.  
    # item中的值取出来写入csv文件中,注意f''是为了转换成字符串不是对象
  18.  
    self.f.write(f"{item['urls']},{item['ips']}\n")
  19.  
     
  20.  
    return item
  21.  
    # 结束时自动调取的函数
  22.  
    def close_spider(self,spider):
  23.  
    self.f.close()
学新通

2.存放在mysql数据库中

settings.py中添加

学新通

  1.  
    class JP_sqlPipeline:
  2.  
    def open_spider(self,spider):
  3.  
    # 导入from scrapy.utils.project import get_project_settings,从settings文件中取出值
  4.  
    settings=get_project_settings()
  5.  
    self.host=settings['POSTCODE_HOST']
  6.  
    self.port=settings['POSTCODE_PORT']
  7.  
    self.user=settings['POSTCODE_USER']
  8.  
    self.name=settings['POSTCODE_NAME']
  9.  
    self.charset=settings['POSTCODE_CHARSET']
  10.  
    self.password=settings['POSTCODE_PASSWORD']
  11.  
    # 开启管道自动调用连接数据库函数 连接数据库
  12.  
    self.connect()
  13.  
    def connect(self):
  14.  
    self.conn=pymysql.connect(
  15.  
    host=self.host,
  16.  
    port=self.port,
  17.  
    user=self.user,
  18.  
    database=self.name,
  19.  
    password=self.password
  20.  
    )
  21.  
    self.cur = self.conn.cursor()
  22.  
     
  23.  
    def process_item(self, item, spider):
  24.  
    # 执行mysql语句
  25.  
    # 还必须写成.format格式化这个语法,写f“”语法总报错
  26.  
    # sql = """insert into jp_postcode(name,postcode)values("{}","{}")""".format(item['area'],item['codes'])
  27.  
    sql = 'insert into jp_postcode(name,postcode)values("{}","{}")'.format(item['area'], item['codes'])
  28.  
    self.cur.execute(sql)
  29.  
    self.conn.commit()
  30.  
    return item
  31.  
    def close_spider(self,spider):
  32.  
    self.cur.close()
  33.  
    self.conn.close()
学新通

四、设置开关,settings.py

1.先查看url是否正常进入parse解析器,如果进不去,找到

# ROBOTSTXT_OBEY = True  注释掉

2. spiders中有自定义cookies,需要打开

COOKIES_ENABLED = True 打开

3.管道需要打开

数字代表顺序

ITEM_PIPELINES = {
   'SQ_URL.pipelines.SqUrlPipeline': 300,
} 

4.文件log日志设置

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfhjhi
系列文章
更多 icon
同类精品
更多 icon
继续加载