文章目录
- 概要
- 爬取流程
- 代码
- 技术细节
- format
- %
- 回调函数
- 小结
概要
爬取段子王网站的
标题
和内容
- 核心
Scrapy的手动请求发送实现的数据爬取
yield scrapy.Request(url,callback):GET
-caL1back指宽解析函数,用于解析数据
yield scrapy.ForRequest(url,callback,formdata):POST
-formdata:字典,请R参数
爬取流程
- 起始网站 start_urls
- 新的目标页面 new_url (新生成的,手动请求发送)⭐
- 解析数据
- 爬取数据
代码
- spider.py
import scrapy
from firstBlood.items import FirstbloodItem
class FirstSpider(scrapy.Spider):
name = "first"
# allowed_domains = ["www.xxx.com"]
start_urls = ['https://duanzi.cn/jingdian/'] # 首页 没有1
# 通用url模板
url = 'https://duanzi.cn/jingdian/%d/' # ⭐
page_num =2
def parse(self, response):
articles = response.xpath('/html/body/div[1]/div[2]/div[2]/div[2]/div[1]/div[1]/div[@class="post item"]')
print('*'*100)
for article in articles:
title = article.xpath('./h2/a/text()').extract_first()
content = article.xpath('./div[2]/text()').extract_first()
item = FirstbloodItem()
item['title'] = title
item['content'] = content
yield item # 提交给管道
if self.page_num < 5 :# 结束递归条件
print(f'第{self.page_num}详情页面的数据!!!')
new_url = format(self.url%self.page_num) # 拼接完整url # ⭐
self.page_num += 1
print(new_url)
# 对新的页面的URL进行请求发送 (手动请求发送)
yield scrapy.Request(url=new_url,callback=self.parse) # 涉及回调函数 是GET请求 ⭐
技术细节
format
- 在 Python 中,你可以使用 str.format() 方法或者格式化字符串字面量(f-strings)来格式化字符串。
name = "Alice"
greeting = "Hello, {}".format(name)
# 使用 f-strings(Python 3.6+)
name = "Alice"
greeting = f"Hello, {name}"
"这是一个{}和{}".format(变量1, 变量2)
# 格式化列表或者元组
data = ('张三', 25)
"{name} 是 {age}".format(*data)
# 格式化嵌套
data = {'name': '张三', 'info': {'age': 25, 'gender': '男'}}
"{name} 是 {info[age]}岁,性别是{info[gender]}".format(**data)
%
在Python中,% 操作符用于字符串格式化,它是一种传统的格式化方法,允许你将变量插入到字符串中。
name = "Alice"
greeting = "Hello, %s" % name
print(greeting) # 输出: Hello, Alice
# 使用字典进行格式化
person = {"name": "Bob", "age": 30}
print "%(name)s is %(age)d years old." % person
# 输出: Bob is 30 years old.
回调函数
在编程中,回调函数是一个通过函数名作为参数传递给其他函数的函数,然后在某个时间点被调用。
在Scrapy框架中,回调函数用于处理响应数据。每当Scrapy接收到一个响应(Response),它就会调用一个特定的函数来处理这个响应,这个函数就是回调函数。
yield scrapy.Request(url=new_url,callback=self.parse) # 涉及回调函数callback=self.parse 是GET请求
小结
- 为什么start_urls列表中的urL会被自动进行get请求的发送?
def start_requests(self):
for u in self.start_urls:
yield scrapy.Request(urlmu,callback=self.parse)
源码 :
- 如何将start_urls中的urL默认进行post请求的发送?
-重写start_requests方法即可
def start_requests(self):
for u in self.start_urls:
yield scrapy.FormRequest(url=u,callback=self.parse,form_data=form_data)