爬取cnvd資料
阿新 • • 發佈:2020-10-09
首先這個網站存在反爬機制,第二,這個是以post的形式傳入的,爬取這2點都有難度
我這裡直接貼程式碼,有註釋
import requests import xlwt from lxml import etree import re from fake_useragent import UserAgent ua = UserAgent() url='https://www.cnvd.org.cn/flaw/list.htm?flag=true' headers = { "User-Agent": ua.random, } resp = requests.post(url, data={'max': 20, 'offset': 0, 'keyword': 'office', 'condition': 1, 'baseinfoBeanbeginTime': '2016-01-01', 'baseinfoBeanendTime': '2020-08-26', 'referenceScope': 1, 'manufacturerId': -1, 'categoryId': -1, 'editionId': -1, 'baseinfoBeanFlag': 0, 'keywordFlag': 0, 'cnvdIdFlag': 0}, headers=headers) #post傳參內容 text =resp.text urlhref = re.findall(r'href="/flaw/show(.*?)"', text) domain = "https://www.cnvd.org.cn/flaw/show" for urlhrefs in urlhref: aas = domain + urlhrefs #此段url為真實的url,需要上一段程式碼提取cnvd的編號與domain的網端組成真正需要爬取的url resps = requests.get(aas, headers=headers) texts = resps.text html = etree.HTML(texts) title = html.xpath("//div[@class='blkContainerSblk']//h1/text()") CVE = re.findall(r'target="_blank">(.*?) </a><br>', texts) #用正則爬取 CNVD = html.xpath("normalize-space(//table[@class='gg_detail']//tr[1]/td[2]/text())") shijian = html.xpath("normalize-space(//table[@class='gg_detail']//tr[2]/td[2]/text())") product = html.xpath("normalize-space(//table[@class='gg_detail']//tr[4]/td[2]/text())") miaosu = html.xpath("normalize-space(//table[@class='gg_detail']/tbody/tr[6]/td[2]//text())") leixing = html.xpath("normalize-space(//table[@class='gg_detail']//tr[7]/td[2]/text())") print(miaosu)
對於反爬機制,我們可以用隨機ua,也可以用代理ip,關於爬取代理ip,我上一篇文章有原始碼,也可以將header裡面的內容增多,將執行緒變為單執行緒
https://www.cnblogs.com/xinxin999/p/13418524.html
爬取cnvd,需要注意的是他post裡面的引數keywords是關鍵詞,max是一頁最大的內容,我現在設定的是20篇,最大可以是100.offset是位移量,比如你設定的max為20,你想要爬取5頁,offset就設為100.
這裡只截了部分圖,資料處理各位兄弟們自行完善。