好友
阅读权限10
听众
最后登录1970-1-1
|
ofk
发表于 2019-3-20 13:48
本帖最后由 ofk 于 2019-3-20 13:51 编辑
新人发个帖,以免被删了,哈哈哈。
首先,看看我们需要爬取得网站,
url:https://butian.360.cn/Reward/plan
使用fiddler抓包分析一波,开启浏览器代{过}{滤}理,点击公益厂商这个按钮:
可以看到链接为http://butian.360.cn/Reward/pub,向服务器请求了三个参数,一个s,一个p,一个token,再看看这个参数的含义,访问第二页看看,参数变化:
发现参数p的值发生了变化,变为2,所以p参数就是页码了,其他的参数就不用再了解了,知道了页码,就可以爬取不同页码的链接,
我们需要爬取的是域名,看看域名所在的地方:
这里有个cid参数,这个参数的值代表了某个厂商,把链接记下来:
https://butian.360.cn/Loo/submit?cid=xx
xx是需要自己去填入,填入后就可获得域名了。
xx在哪提取呢?看看
xx的值可在json数据中提取,
开始编写代码吧:
[Python] 纯文本查看 复制代码 #coding:utf-8
from urllib import request,parse
import re
url = "http://butian.360.cn/Reward/pub"
data = {
's':1,
'p':1,
'token':''
}
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Cookie': '你的cookie',
'Host': 'butian.360.cn',
'Referer': 'https://butian.360.cn/',
'Upgrade-Insecure-Requests': 1,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 QIHU 360EE'
}
data = parse.urlencode(data).encode('utf-8')#对post请求参数进行url编码
changshang = request.Request(url, data = data, headers=headers, method='POST')
respones = request.urlopen(changshang).read().decode('utf-8')
#正则匹配需要的内容----cid值
parrtern = re.compile(r'\"company_id\":\"(\d*?)\"')
text = parrtern.findall(respones)
for i in range(len(text)):
url = "https://butian.360.cn/Loo/submit?cid="+text[i]
yuming = request.Request(url,headers=headers)
respones = request.urlopen(yuming).read().decode('utf-8')
#正则匹配需要的内容----域名和厂商
parrtern1 = re.compile(r'<span>厂商名称:.*?value="(.*?)"')
parrtern2 = re.compile(r'<span>所属域名:.*?value="(.*?)"')
text1 = parrtern1.findall(respones)
text2 = parrtern2.findall(respones)
print(text1[0]+'-----------'+text2[0])
先爬第一页看看:
成功爬取了一页的厂商域名,
现在改一下代码,让代码有一点交互性:[Python] 纯文本查看 复制代码 #coding:utf-8import re
from urllib import request,parse
import gzip
#爬取公益厂商的id
def get_Con(ye):
url = "http://butian.360.cn/Reward/pub"
data = {
's':1,
'p':ye,
'token':''
}
data = parse.urlencode(data).encode('utf-8')#对post请求参数进行url编码
changshang = request.Request(url, data = data, headers=headers, method='POST')
respones = request.urlopen(changshang).read().decode('utf-8')
#正则匹配需要的内容----cid值
parrtern = re.compile(r'\"company_id\":\"(\d*?)\"')
text = parrtern.findall(respones)
# print(text)
return text
def get_Url(id):
global count
url = 'http://butian.360.cn/Loo/submit?cid='+id
yuming = request.Request(url,headers=headers)
respones = request.urlopen(yuming).read()
#由于网页时gzip编码的,所以需要解码
f = gzip.decompress(respones).decode('utf-8')
#正则匹配需要的内容----域名和厂商
parrtern1 = re.compile(r'<span>厂商名称:.*?value="(.*?)"')
parrtern2 = re.compile(r'<span>所属域名:.*?value="(.*?)"')
text1 = parrtern1.findall(f)
text2 = parrtern2.findall(f)
data = text1[0] + '------' + text2[0]
# print(data)
filename.write(data+'\n')
count = count + 1
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Cookie': '你的cookie',
'Host': 'butian.360.cn',
'Referer': 'https://butian.360.cn/',
'Upgrade-Insecure-Requests': 1,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 QIHU 360EE'
}
x = int(input('请输入开始页码:'))
y = int(input('请输入结束页码:'))
#创建一个文件
filename = open('butian.txt','a')
count = 0
def main():
for i in range(x,y+1):
id = get_Con(i)
for i in id:
get_Url(i)
print("爬取了%d个"%(count))
print("------爬取完毕------")
filename.close()
if __name__ == "__main__":
main()
运行后就会在目录下生产一个butian.txt,里面是爬取的厂商域名
原本想使用多线程的,但是写完发现爬不到,并且卡死,所以就没有使用多线程。
可能是我的代码死锁了。
本代码没有cookie,所以cookie自己填入就可以了。有哪些不对的地方请各位大佬指出,学习学习! |
|