如何自己實現乙個scrapy框架 專案實戰(八)

2021-08-22 08:41:17 字數 4409 閱讀 9739

from scrapy_plus.core.spider import spider

from scrapy_plus.htttp.request import request

class tencentspider(spider):

name = 'tencent'

start_urls = ['']

def parse(self, response): # 對start_urls進行解析

print(response.url + '*****')

tr_list = response.xpath('//*[@class="tablelist"]//tr')[1:-1]

print(len(tr_list))

for tr in tr_list:

item = {}

# 獲取一部分資料

item['name'] = tr.xpath('./td[1]/a/text()')[0]

item['address'] = tr.xpath('./td[4]/text()')[0]

item['time'] = tr.xpath('./td[5]/text()')[0]

# 獲取詳情頁url,並傳送請求

detail_url = '' + tr.xpath('./td[1]/a/@href')[0]

print(detail_url)

yield request(

detail_url,

parse='parse_detail',

meta=item # meta接收乙個字典

)# 翻頁

yield request(next_url, parse='parse')

def parse_detail(self, response):

# print(response.body)

item = response.meta # 獲取傳入的meta

item['job_content'] = response.xpath('//*[@class="squareli"]//text()')[0] # 加入崗位職責資料

print(item)

yield item

修改專案的settings.py

......

# 啟用的爬蟲類

]......

此時執行專案的main.py程式異常

indexerror: list index out of range
經過debug我們發現,是因為請求頭缺少了 user-agent!

##2 修改scrapy_plus**

# scrapy_plus/conf/default_settings.py

......

# 預設請求頭

# scrapy_plus/core/spider.py

......

from scrapy_plus.conf.settings import headers

......

def start_requests(self):

for url in self.start_urls:

# 此處修改

from scrapy_plus.conf.settings import headers # 此處新增

class request():

"""這是封裝的request物件"""

def __init__(self, url, method='get', data=none, headers=headers, parse='parse', meta={}, filter=true): # 此處修改

......

import time

from scrapy_plus.core.spider import spider

from scrapy_plus.htttp.request import request

import js2py

class sinagundong(spider):

name = "sina"

headers =

def start_requests(self):

while true:

# 需要發起這個請求,才能獲取到列表頁資料,並且返回的是乙個js語句

url = ""

yield request(url, parse='parse', filter=false)

time.sleep(60) # 每60秒發起一次請求

def parse(self, response):

'''響應體資料是js**'''

# 使用js2py模組,執行js**,獲取資料

ret = js2py.eval_js(response.body.decode("gbk")) # 對**分析發現,資料編碼格式是gbk的,因此需要先進行解碼

for news in ret.list: #

yield request(news["url"], headers=self.headers, parse='parse_detail', meta=)

def parse_detail(self, response):

# print(response.body)

response.body = response.body.decode("utf-8") # 部分頁面無法正確解碼,因此在這裡手動進行解碼操作

title = response.xpath("//h1[@class='main-title']/text()")[0]

pub_date = response.xpath("//span[@class='date']/text()")[0]

try:

author = response.xpath("//div[@class='date-source']//a/text()")[0] # 由於作者的提取,有兩種格式,因此這裡使用乙個異常捕獲來進行判斷

except indexerror:

author = response.xpath("//div[@class='date-source']//span[contains(@class,'source')]/text()")[0]

content = response.xpath("//div[@class='article']//text()") # 多個 每乙個代表一段

image_links = response.xpath("//div[@class='article']//img/@src") # 鏈結有多個

item =

print(item)

yield item

##2 在專案settings.py中開啟該爬蟲

# 修改預設日誌檔名稱

default_log_filename = '日誌.log' # 預設日誌檔名稱

# 啟用的爬蟲類

]# 啟用的管道類

]# 啟用的爬蟲中介軟體類

spider_middlewares =

**********_middlewares =

# scheduler_persist = true

# fp_persist = false

# async_type = 'coroutine' # 預設為執行緒的方式

如何自己實現乙個HTMLRunner

htmlrunner是模仿unittest自帶的texttestrunner 實現的,我們先來看看texttestrunner 的執行流程。import unittest suite unittest.defaulttestloader.discover with open report.txt w...

自己實現乙個Redux。

redux是乙個用於狀態管理的js框架,是flux架構的一種實現 如圖 reducer 為乙個使用者自定義的函式,在store分發 dispacth action時提供處理方法去更新狀態樹中的狀態。應該為乙個純函式。action 為乙個使用者自定義的物件,裡面包含乙個type屬性,標識乙個動作型別。...

如何自己寫乙個日曆

在很多 都有自己的乙個日曆工具,有些看起來挺酷的,肯定有很多人想學.但在這裡我不是要寫乙個,而是給出它的設計過程,即它的靈魂.第一步 首先我們要選擇要顯示的年份和月份.第二步 獲得這個月的最大天數 參照前面一篇文章 第三步 建立乙個日期物件,這個日期物件為這個月的第一天.第四步 得到這個日期物件的星...