python scrapy爬取网站数据二(scrapy使用详细介绍)

本文介绍了使用Scrapy框架进行网站数据爬取的方法,包括工程创建、编写爬虫代码及数据处理流程。通过实例演示了如何从网站抓取新闻标题和内容,并将其保存到本地文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇文章 python scrapy爬取网站数据一 从一个简单的例子中给大家呈现了scrapy的使用,本篇将对scrapy的常用写法 做一个简单的介绍。

1、scrapy工程创建

在命令行输入如下命令,创建一个使用scrapy框架的工程

scrapy startproject scrapyDemo

命令
创建好后的工程结构如下图
scrapy工程结构

输入如下命令,在工程目录中创建示例代码

PS C:\ProjectPycharm> cd scrapyDemo
PS C:\ProjectPycharm\scrapyDemo> scrapy genspider example example.com
Created spider 'example' using template 'basic' in module:
  scrapyDemo.spiders.example

示例代码

上面的工程文件说明

  • scrapyDemo/spiders/ 爬虫目录,如:创建文件,编写爬虫规则
  • scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)(一般不需要做修改)
  • items.py 设置数据存储模板,用于结构化数据,如:Django的Model,定义的结构可在piplines中、example.py中使用
  • pipelines.py 数据处理行为,如:一般结构化的数据持久化(保存到excel、保存到数据库、下载图片到本地等)
  • settings.py 配置文件,如:递归的层数、并发数,延迟下载等

2、scrapy简单爬虫代码

本示例代码以爬取今日头条的新闻,抓取标题和内容并保存为本地文件。

1)定义爬取的条目(item)

该条目的信息 在items.py中定义,在example.py中填充,通过pipelines.py保存到excel

# items.py
import scrapy
class ScrapydemoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()  # 新闻标题
    content = scrapy.Field() # 新闻内容
    pass

2)爬取信息

在example.py中编写爬取信息代码,首先访问FT中文网-中国咨询,然后遍历新闻分类banner,然后访问该分类,在获取该分类下的新闻列表,然后访问每条新闻的详细信息页,保存新闻标题和内容到item中

① xpath分析

财经的xpath截取为:

categoryLinks = response.xpath('//li[@data-section="china"]/ol[@class="nav-items"]/li[@class="nav-item"]/a/@href').extract()
categoryNames = response.xpath('//li[@data-section="china"]/ol[@class="nav-items"]/li[@class="nav-item"]/a/text()').extract()

xpath分析

② 爬取代码

在发起请求函数scrapy.Request中可以传入自定义值到meta这个变量中,可以在自定义分析函数中获取到请求中的自定义参数

# -*- coding: utf-8 -*-
import scrapy
from scrapyDemo.items import ScrapydemoItem
headers = {
    'accept':'application/json, text/javascript',
    'accept-encoding':'gzip, deflate, br',
    'accept-language':'zh-CN,zh;q=0.9',
    'content-type':'application/x-www-form-urlencoded',
    'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
    'x-requested-with':'XMLHttpRequest'
}

class ExampleSpider(scrapy.Spider):
    name = 'ExampleSpider'
    allowed_domains = ['www.ftchinese.com']
    start_urls = []

    def start_requests(self):
        yield scrapy.Request('http://www.ftchinese.com/channel/china.html',headers=headers,meta={'baseUrl': 'http://www.ftchinese.com/'}, callback=self.parse)

    def parse(self, response):
        baseUrl = response.meta['baseUrl']
        categoryLinks = response.xpath('//li[@data-section="china"]/ol[@class="nav-items"]/li[@class="nav-item"]/a/@href').extract()
        categoryNames = response.xpath('//li[@data-section="china"]/ol[@class="nav-items"]/li[@class="nav-item"]/a/text()').extract()

        i = 0
        for categoryLink in categoryLinks:
            #  meta={'category': categoryNames[i]} 用于scrapy爬取信息分散在多个页面,
            #  用于向后面的parse传递前面parse分析得到的内容
            yield scrapy.Request(baseUrl+categoryLink,headers=headers,meta={'category': categoryNames[i],'baseUrl':baseUrl},
                                 callback=self.parseTwise)
            i = i+1


    def parseTwise(self,response):
        baseUrl = response.meta['baseUrl']
        newLinks = response.xpath('//a[@class="item-headline-link"]/@href').extract()
        for newLink in newLinks:
            yield scrapy.Request(baseUrl+newLink,headers=headers, meta=response.meta,callback=self.parseThird)


    def parseThird(self,response):
        category = response.meta['category']
        newTitle = response.xpath('//h1[@class="story-headline"]/text()').extract()
        newContent = response.xpath('//h1[@class="story-body"]/text()').extract()

        item = ScrapydemoItem()
        item['category'] = category
        item['title'] = if len(newTitle)<=0 else newTitle[0]
        item['content'] = '' if len(newContent)<=0 else newContent[0]
        yield item

3)保存内容

在pipelines.py中编写保存文件代码

import os

class ScrapydemoPipeline(object):
    def process_item(self, item, spider):
        basePath = "c:\\ft_news\\"
        fileFolder = basePath + "\\" + item['category']
        filePath = fileFolder+"\\"+item['title']+".txt"
        if not os.path.exists(fileFolder):  # 判断当前路径是否存在,没有则创建new文件夹
            os.makedirs(fileFolder)
        file = open(filePath, 'w')
        file.write(item['content'])  # 写入内容信息

        file.close()
        print(filePath)
        return item

4)工程启用功能配置

想让 ScrapydemoPipeline起作用,我们还需要在settings.py中添加开启pipline(开启通道)代码。

# settings.py文件代码
BOT_NAME = 'scrapyDemo'

SPIDER_MODULES = ['scrapyDemo.spiders']
NEWSPIDER_MODULE = 'scrapyDemo.spiders'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# 开启pipline
ITEM_PIPELINES = {
    'scrapyDemo.pipelines.ScrapydemoPipeline':300
}
# 设置爬取速度,一般为0.25~0.3(即250ms~300ms)间,设置的时间太短,网关防火墙会截获连接认为是恶意访问
DOWNLOAD_DELAY = 0.3

3、总结

本篇博客记录了scrapy常用的功能,同时还在示例代码中展示了 多级访问共享参数的方式,即

# meta中放入共享参数即可
scrapy.Request(baseUrl+categoryLink,headers=headers,
                meta={'category': categoryNames[i],'baseUrl':baseUrl},
                callback=self.parseTwise)
要抓取Python中的商品价格,你可以使用网页爬虫技术来获取商品信息。通过分析网页的HTML结构,你可以找到包含商品价格的元素,并提取出来。 举个例子,你可以使用Python的第三方库,如Beautiful Soup,来解析网页并提取出商品价格。首先,你需要使用HTTP请求库,如Requests,获取网页的内容。然后,你可以使用Beautiful Soup来解析HTML并查找包含商品价格的元素。 在引用中的代码示例中,可以看到使用了Selenium库来模拟浏览器操作,获取网页上的商品信息。可以根据具体情况修改代码,只提取出商品价格部分。 以下是一个示例代码,展示了如何使用Beautiful Soup来提取商品价格: ```python import requests from bs4 import BeautifulSoup # 发送GET请求获取网页内容 url = 'your_url_here' response = requests.get(url) html = response.text # 使用Beautiful Soup解析HTML soup = BeautifulSoup(html, 'html.parser') # 查找包含商品价格的元素 price_element = soup.find('span', class_='p-price') # 提取商品价格 price = price_element.text # 打印商品价格 print(price) ``` 请将`your_url_here`替换为实际的网页链接。通过以上代码,你可以抓取到商品的价格。注意,具体的网页结构可能会有所不同,你需要根据实际情况调整代码。 总结起来,要抓取Python中的商品价格,你可以使用网页爬虫技术,通过解析HTML并查找包含商品价格的元素来提取出来。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python笔记.docx](https://download.youkuaiyun.com/download/bxy0806/88235414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python爬虫 批量采集京东商品数据,实时了解商品价格走势](https://blog.youkuaiyun.com/ooowwq/article/details/122435249)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【Python】爬虫入门级实战讲解:爬取商城的商品名称及价格](https://blog.youkuaiyun.com/jcwang710448116/article/details/82256956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风水月

从心底相信自己是成功的第一步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值