php多线程抓取网页( DOM树结构的解析资源地址保存到文件中的文件地址)
优采云 发布时间: 2021-11-12 13:02php多线程抓取网页(
DOM树结构的解析资源地址保存到文件中的文件地址)
#解析首页
def CrawIndexPage(starturl):
print "正在爬取首页"
page = __getpage(starturl)
if page=="error":
return
page = page.decode('gbk', 'ignore')
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@id='menu']//a")
print "首页解析出地址",len(Nodes),"条"
for node in Nodes:
CrawledURLs = []
CrawledURLs.append(starturl)
url=node.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 page=="error":
return
CrawledURLs.append(indexurl)
page = page.decode('gbk', 'ignore')
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@class='co_content8']//a")
for node in Nodes:
url=node.xpath("@href")[0]
if re.match(r'/', url):
# 非分页地址 可以从中解析出视频资源地址
if __isexit(host + url,CrawledURLs):
pass
else:
#文件命名是不能出现以下特殊符号
filename=node.xpath("text()")[0].encode("utf-8").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 page=="error":
return
CrawledURLs.append(url)
page = page.decode('gbk', 'ignore')
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@align='left']//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.CrawledURLs=CrawledURLs
def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
CrawListPage(self.url, self.newdir,self.CrawledURLs)
以上只是部分代码,所有代码都可以在GitHub上下载(点我跳转)
最终的爬取结果如下。
以上就是小编为大家使用Python多线程爬虫对电影天堂资源进行爬取的介绍。我希望它会对你有所帮助。如果您有任何问题,请给我留言。小编会及时回复您。非常感谢您对PHP中文网站的支持!
更多Python多线程爬虫爬取电影天堂资源相关文章请关注PHP中文网!
免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系