爬虫:静态网页爬取
工具:pycharm,python3.6,火狐浏览器
模块:requests(可以使用pip install requests安装),re(不用安装)
网址:http://www.ygdy8.net/html/gndy/dyzz/index.html电影天堂
复制影片名称,在网页源代码中查找,看能否找到。
查看页面源代码,Ctrl+f。
在网页源代码中,能够查找到内容。这样一般都是属于静态网页。查找不到,一般是动态网页。动态网页需要按F12,在network(网络)中查找。
随便点击一个电影,就会到电影详情界面。往下浏览会看到下载地址,磁力链。
这就是我们要获取的磁力链地址。
我们再看一下主页,看到下面的翻页界面。
我们点击第二页,观察一下网址。
这是前三页的网址。
首页网址是http://www.ygdy8.net/html/gndy/dyzz/index.html,与
http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html是一样的
http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html
http://www.ygdy8.net/html/gndy/dyzz/list_23_2.html
http://www.ygdy8.net/html/gndy/dyzz/list_23_3.html
编写代码,首先实现翻页功能,共有177页,我们利用for循环制造网址。
使用字符串拼接。打印查看网址。
for page in range(1,178):
url='http://www.ygdy8.net/html/gndy/dyzz/list_23_'+str(page)+'.html'
print(url)
我们可以得到177页的网址。
我们先分析一页,在里面查找磁链接。这样我们需要先进入详情页面,然后在里面找到磁链接。
看一下这个页面的网址:http://www.ygdy8.net/html/gndy/dyzz/20180804/57202.html
我们在http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html
的网页源代码里,查找一下20180804/57202看能否找到。
刚好找到这个网址。我们在网页源代码中把这个链接提取出来。得到详情页。
先访问,获取源代码
for page in range(1,2):
url='http://www.ygdy8.net/html/gndy/dyzz/list_23_'+str(page)+'.html'
print(url)
html=requests.get(url)
print(html)
print(html.text)
发现获取到的源码有乱码,我们需要指定一下编码格式。
按F12查看元素
发现编码charset=gb2312
for page in range(1,2):
url='http://www.ygdy8.net/html/gndy/dyzz/list_23_'+str(page)+'.html'
print(url)
html=requests.get(url)
html.encoding="gb2312"
print(html.text)
指定编码后,打印出来不再是乱码了。接下来提取网页源码中的信息,也就是详情页,网址是相对网址,不是完整网址("/html/gndy/dyzz/20180804/57202.html"),提取出来以后还需要拼接成完整的网址。
使用正则表达式提取。
data=re.findall('',html.text) #返回的是列表
print(data)
正则表达式(.*?)非贪婪匹配。加括号是提取出来
循环得到详情页完整网址
for m in data:
xqurl = 'http://www.ygdy8.net'+m
print(xqurl)
这样就得到一页中所有电影的详情页。我们随意找一个xqurl打开,都能看到电影的详细信息。接下来获取详情页的源代码。在源代码中利用正则表达式获取磁力连接。
xqurl = 'http://www.ygdy8.net'+m
#print(xqurl)
html2=requests.get(xqurl)
html2.encoding='gb2312'#指定编码
#print(html2.text)
dyLink = re.findall('ftp://.*?',html2.text)[0]
print(dyLink)
为了防止有些匹配不到信息,数组越界,我们使用try。
xqurl = 'http://www.ygdy8.net'+m
#print(xqurl)
html2=requests.get(xqurl)
html2.encoding='gb2312'#指定编码
#print(html2.text)
try:
dyLink = re.findall('ftp://.*?',html2.text)[0]
print(dyLink)
except:
print("没有匹配信息")
将获取链接写入到记事本
with open('电影天堂.txt','a') as f:
f.write(dyLink+'\n')
#完整代码
import requests
import re
for page in range(1,178):
url='http://www.ygdy8.net/html/gndy/dyzz/list_23_'+str(page)+'.html'
print(url)
html=requests.get(url)
html.encoding="gb2312"
#print(html.text)
data=re.findall('',html.text) #返回的是列表
#print(data)
for m in data:
xqurl = 'http://www.ygdy8.net'+m
#print(xqurl)
html2=requests.get(xqurl)
html2.encoding='gb2312'#指定编码
#print(html2.text)
try:
dyLink = re.findall('ftp://.*?',html2.text)[0]
print(dyLink)
except:
print("没有匹配信息")
with open('电影天堂.txt','a',encoding="utf-8") as f:
f.write(dyLink+'\n')
代码中可以用time模块控制爬取每页的时间。防止ip被封。也可以使用代理ip