建工教育网校官方网站,wordpress 粘贴图片,北碚免费建站哪家做得好,wordpress 采集 json最近花些时间学习了一下Python#xff0c;并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址#xff0c;代码已经上传到GitHub上了#xff0c;需要的同学可以自行下载。刚开始学习python希望可以获得宝贵的意见。
先来简单介绍一下#xff0c;网络爬虫的基本实…最近花些时间学习了一下Python并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址代码已经上传到GitHub上了需要的同学可以自行下载。刚开始学习python希望可以获得宝贵的意见。
先来简单介绍一下网络爬虫的基本实现原理吧。一个爬虫首先要给它一个起点所以需要精心选取一些URL作为起点然后我们的爬虫从这些起点出发抓取并解析所抓取到的页面将所需要的信息提取出来同时获得的新的URL插入到队列中作为下一次爬取的起点。这样不断地循环一直到获得你想得到的所有的信息爬虫的任务就算结束了。我们通过一张图片来看一下。好的 下面进入正题来讲解下程序的实现。
首先要分析一下电影天堂网站的首页结构。从上面的菜单栏中我们可以看到整个网站资源的总体分类情况。刚刚好我们可以利用到它的这个分类将每一个分类地址作为爬虫的起点。
①解析首页地址 提取分类信息
#解析首页
def CrawIndexPage(starturl):
print 正在爬取首页
page __getpage(starturl)
if pageerror:
return
page page.decode(gbk, ignore)
tree etree.HTML(page)
Nodes tree.xpath(//div[idmenu]//a)
print 首页解析出地址,len(Nodes),条
for node in Nodes:
CrawledURLs []
CrawledURLs.append(starturl)
urlnode.xpath(href)[0]
if re.match(r/html/[A-Za-z0-9_/]/index.html, url):
if __isexit(host url,CrawledURLs):
pass
else:
try:
catalog node.xpath(text())[0].encode(utf-8)
newdir E:/电影资源/ catalog
os.makedirs(newdir.decode(utf-8))
print 创建分类目录成功------newdir
thread myThread(host url, newdir,CrawledURLs)
thread.start()
except:
pass
在这个函数中首先将网页的源码下载下来通过XPath解析出其中的菜单分类信息。并创建相应的文件目录。有一个需要注意的地方就是编码问题但是也是被这个编码纠缠了好久通过查看网页的源代码我们可以发现网页的编码采用的是GB2312这里通过XPath构造Tree对象是需要对文本信息进行解码操作将gb2312变成Unicode编码这样DOM树结构才是正确的要不然在后面解析的时候就会出现问题。
②解析每个分类的主页
# 解析分类文件
def CrawListPage(indexurl,filedir,CrawledURLs):
print 正在解析分类主页资源
print indexurl
page __getpage(indexurl)
if pageerror:
return
CrawledURLs.append(indexurl)
page page.decode(gbk, ignore)
tree etree.HTML(page)
Nodes tree.xpath(//div[classco_content8]//a)
for node in Nodes:
urlnode.xpath(href)[0]
if re.match(r/, url):
# 非分页地址 可以从中解析出视频资源地址
if __isexit(host url,CrawledURLs):
pass
else:
#文件命名是不能出现以下特殊符号
filenamenode.xpath(text())[0].encode(utf-8).replace(/, )\
.replace(\\, )\
.replace(:, )\
.replace(*, )\
.replace(?, )\
.replace(\, )\
.replace(, ) \
.replace(, )\
.replace(|, )
CrawlSourcePage(host url,filedir,filename,CrawledURLs)
pass
else:
# 分页地址 从中嵌套再次解析
print 分页地址 从中嵌套再次解析,url
index indexurl.rfind(/)
baseurl indexurl[0:index 1]
pageurl baseurl url
if __isexit(pageurl,CrawledURLs):
pass
else:
print 分页地址 从中嵌套再次解析, pageurl
CrawListPage(pageurl,filedir,CrawledURLs)
pass
pass
打开每一个分类的首页会发现都有一个相同的结构点击打开示例首先解析出包含资源URL的节点然后将名称和URL提取出来。这一部分有两个需要注意的地方。一是因为最终想要把资源保存到一个txt文件中但是在命名时不能出现一些特殊符号所以需要处理掉。二是一定要对分页进行处理网站中的数据都是通过分页这种形式展示的所以如何识别并抓取分页也是很重要的。通过观察发现分页的地址前面没有“/”,所以只需要通过正则表达式找出分页地址链接然后嵌套调用即可解决分页问题。
③解析资源地址保存到文件中
#处理资源页面 爬取资源地址
def CrawlSourcePage(url,filedir,filename,CrawledURLs):
print url
page __getpage(url)
if pageerror:
return
CrawledURLs.append(url)
page page.decode(gbk, ignore)
tree etree.HTML(page)
Nodes tree.xpath(//div[alignleft]//table//a)
try:
source filedir / filename .txt
f open(source.decode(utf-8), w)
for node in Nodes:
sourceurl node.xpath(text())[0]
f.write(sourceurl.encode(utf-8)\n)
f.close()
except:
print !!!!!!!!!!!!!!!!!
这段就比较简单了将提取出来的内容写到一个文件中就行了
为了能够提高程序的运行效率使用了多线程进行抓取在这里我是为每一个分类的主页都开辟了一个线程这样极大地加快了爬虫的效率。想当初只是用单线程去跑结果等了一下午最后因为一个异常没处理到结果一下午都白跑了心累
class myThread (threading.Thread): #继承父类threading.Thread
def __init__(self, url, newdir,CrawledURLs):
threading.Thread.__init__(self)
self.url url
self.newdir newdir
self.CrawledURLsCrawledURLs
def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
CrawListPage(self.url, self.newdir,self.CrawledURLs)
以上只是部分代码全部代码可以到GitHub上面去下载点我跳转
最后爬取的结果如下。以上所述是小编给大家介绍的使用Python多线程爬虫爬取电影天堂资源 希望对大家有所帮助如果大家有任何疑问请给我留言小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持