1. 程式人生 > 其它 >爬蟲實戰入門

爬蟲實戰入門

爬蟲0(正則表示式查詢,get)

11月15日

##獲取豆瓣電影top250



import requests
import re


#首先獲取url,然後用瀏覽器F12發現是get請求
url='https://movie.douban.com/top250'
headers={
'User-Agent':
	'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0'
}
i=0

for i in range(0,226,25):
    ##傳送請求,拿到網頁原始碼
    ##把param放到這裡是因為這個網頁每25個電影為一頁
    ##如果我想獲取top250,就需要跳轉10次
    param = {
        'start': i,
        'filter': ''
    }
    resp=requests.get(url,headers=headers,params=param)
    text=resp.text


    ##通過正則表示式找到名字
    obj=re.compile(r'<div class="info">.*?<span class="title">(?P<name>.*?)</span>',re.S)
    result=obj.finditer(text)
    for name in result:
        print(name.group('name'))



##記得關閉通道
resp.close()

獲取豆瓣電影top250

使用request和re方法

爬蟲1 (正則表示式查詢,進入子連結,get)

11月16日

import requests
import re
import urllib3
headers={

}
url='https://www.dytt89.com/'
resp=requests.get(url,verify=False)
resp.encoding='gb2312'
resp_text=resp.text

obj=re.compile(r'2022必看熱片.*<ul>(?P<ul>.*?)</ul>',re.S)
resule=obj.finditer(resp_text)
for it in resule:
    ul_text=it.group('ul')
son_link_list=[]
obj2=re.compile(r"href='/(?P<son_link>.*?)' title=")
result1=obj2.finditer(ul_text)
for son_link in result1:
    tem=son_link.group('son_link')
    son_link_list.append(tem)


for son_link_tem in son_link_list:
    url_tem=url+son_link_tem
    print(url_tem)
    urllib3.disable_warnings()
    resp=requests.get(url_tem,verify=False)
    resp.encoding = 'gb2312'
    resp_text=resp.text
    obj3=re.compile(r"<title>(?P<name>.*?)_電影天堂</title>",re.S)
    result_tem=obj3.finditer(resp_text)
    for name in result_tem:
        print(name.group("name"))

    obj4=re.compile(r"<tr>.*?<td style=.*?<a href=\".*?\">(?P<link_xunlei>.*?)</a>.*?</tr>.*?</tbody>",re.S)
    result_tem = obj4.finditer(resp_text)
    for link in result_tem:
        print(link.group("link_xunlei"))
        print('\n')
        break
resp.close()

採用requests庫和re庫

通過request傳送get or post請求,得到網頁原始碼,然後用正則表示式搜尋原始碼文字,找到電影子連結並進入,拿到電影名稱以及他的磁力連結


爬蟲2(找到菜名,菜價 post)

(post方式)

import requests
import re

url='http://www.xinfadi.com.cn/getCat.html'
headers={
'User-Agent':
	'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0'

}
dw={
'prodCatid'	:"1186"
}

resp=requests.post(url,headers=headers,data=dw)
text=resp.text
obj1=re.compile(r'"prodName":"(?P<prodName>.*?)"',re.S)
obj2=re.compile(r'"lowPrice":"(?P<lowPrice>.*?)"',re.S)
obj3=re.compile(r'"highPrice":"(?P<highPrice>.*?)"',re.S)
result1=obj1.finditer(text)
result2=obj2.finditer(text)
result3=obj3.finditer(text)

for find in result1:
	print(find.group('prodName'))
for find in result2:
	print(find.group('lowPrice'))
for find in result3:
	print(find.group('highPrice'))



抓包找post

模擬傳送請求得到響應,然後對響應分析

找出了菜名,菜的最低價、最高價

當然這個沒排序,學會匯出表格的話應該還湊活用。。

爬蟲3(豆瓣top250 demo版本,採用bs4中的BeautifulSoup函式)

##採用bs4中的BeautifulSoup 通過標籤來查詢內容

#首先還是獲得頁面原始碼
import requests
from bs4 import  BeautifulSoup
url='https://movie.douban.com/top250'
headers={
'User-Agent':
	'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0'
}
resp=requests.get(url,headers=headers)
page=BeautifulSoup(resp.text,"html.parser") ##注意這裡,通過這個函式獲取了page,為了後面能查標籤,"html.parser"是為了告訴這個函式你前面那個是什麼檔案
result1=page.find("ol",class_='grid_view' )##find是找到一個就返回,find_all是全找到
result2=result1.find_all('span',class_='title')[0:]  ##找到很多的話,直接切片
for tem in result2:
	tds=tem.text #找到被標籤標記的內容
	print(tds)
	print('\n',end='')


resp.close()

採用bs4庫中的Beautifulsoup函式

通過標籤來查詢內容


爬蟲4:

使用了正則表示式和BeautifulSoup

報錯了

爬整個網站的圖:(太爽了)

import requests
from bs4 import  BeautifulSoup
import re

##拿到頁面原始碼
for i in range(1,251,1):
	url_raw='http://www.netbian.com/'
	if(i!=1):
		son_url=f'index_{i}.htm'
	else:
		son_url=''
	url=url_raw+son_url
	headers={
	'User-Agent':
		'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0'
	}

	#抓取子連結
	resp=requests.get(url,headers=headers)
	resp.encoding='gbk'
	page=BeautifulSoup(resp.text,'html.parser')
	result=page.find('div',class_='list')
	obj=re.compile(r'<a href="(?P<href>.*?)"',re.S)
	href_list=obj.finditer(str(result))
	for href in href_list :
		if href.group("href")[0]!= 'h':
			chilf_href=href.group("href").strip('/')
			link=url_raw+chilf_href
			##套娃,再次進入子連結
			resp=requests.get(link)
			resp.encoding='gbk'
			page=BeautifulSoup(resp.text,'html.parser')

			result=page.find('div',class_='endpage')
			result=result.find('div',class_="pic")
			obj=re.compile(r'src="(?P<link>.*?)"',re.S)
			result_list=obj.finditer(str(result))
			for link in result_list:
				print(link.group("link"))
resp.close()