php多线程抓取网页( DOM树结构的解析资源地址保存到文件中的文件地址)

优采云 发布时间: 2021-11-12 13:02

  php多线程抓取网页(

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中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线