大家好,又见面了,我是你们的朋友全栈君。
这个爬虫是单线程,因为在多线程的情况下,请求容易被煎蛋搞掉,而且还要sleep(1)不然速度过快也会被干掉,然而即使是这样也不能全部爬取,当然,我用的headers只有一个useragent,有心的可以多弄几个每次请求都随即取就好了 上代码
import urllib
import urllib2
from lxml import html
import os
import time
def getTree(pageUrl):
#这里可以用多个useragent随机,比较不容易被干掉
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
myHeaders = {
'User-Agent': user_agent}
req = urllib2.Request(pageUrl,headers=myHeaders)
page_content = urllib2.urlopen(req).read()
tree = html.fromstring(page_content)
return tree
#获取当前页面的后面页面的URL
def getAllUrls(n_tree):
url_arr = n_tree.xpath('//div[@class="comments"]/div[@class="cp-pagenavi"]/a/@href')
return url_arr
#通过图片链接下载图片
def downLoadPic(picUrl,count):
string = picUrl[-3:]
if string == 'jpg':
urllib.urlretrieve(picUrl,'f:\\picFile\\'+str(count)+'.jpg')
time.sleep(1)
# else:
#gif图
# urllib.urlretrieve(picUrl,'f:\\picFile\\'+str(count)+'.gif')
#获取当前页面的所有图片链接
def getAllPicUrls(m_tree):
mylist = []
pic_arr = m_tree.xpath('//div[@class="row"]/div[@class="text"]/p/img/@src')
for e in pic_arr:
e = 'http:'+e
mylist.append(e)
return mylist
if __name__ == '__main__':
mytree = getTree('http://jandan.net/ooxx')
pic_arr = getAllPicUrls(mytree)
count = 0
os.mkdir('f:\\picFile\\')
for e in pic_arr:
count = count+1
downLoadPic(e,count)
afterList = getAllUrls(mytree)
afterPageUrl = afterList[0]
while afterPageUrl> 0:
newTree = getTree(afterPageUrl)
newPicArr = getAllPicUrls(newTree)
for a in newPicArr:
count = count + 1
downLoadPic(a,count)
newList = getAllUrls(newTree)
afterPageUrl = newList[2]
print '------->'+afterPageUrl
复制代码
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107541.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...