鱼C论坛

 找回密码
 立即注册
查看: 1085|回复: 14

[已解决]请问为什么用scrapy写一个之前已经实现的程序,xpath解析的结果却出现不同?

[复制链接]
发表于 2018-11-25 20:35:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码:
<code>
# -*- coding: utf-8 -*-
import scrapy
from twlk.items import TwlkItem

class MoviesSpider(scrapy.Spider):
    name = 'movies'
    #allowed_domains = ['twlkbt.com']

    def start_requests(self):
        start_urls = ['http://twlkbt.com/forum-2-%s.html' %str(x) for x in range(1,3)]
        #print(start_urls)
        for url in start_urls:
            yield scrapy.Request(url,self.parse)

    def parse(self, response):
        # GET SINGLE_PAGE URL
        for href in response.xpath('//a[@class=\'xst\']/@href'):
            yield response.follow(href,self.parse2)

    def parse2(self,response):
        item = TwlkItem()
        #get torrent link
        src_link = response.xpath("//span[@onmouseover]/a/@href")
        print('外部src_link是:',src_link)
        item['title'] = response.xpath("//*[@id='thread_subject']/text()").extract_first()
        #title = title.replace('/','-')
        #title = title.replace(':',' ')
        #img_url = response.xpath("//img[@onclick='zoom(this, this.src, 0, 0, 0)']/@src")
        #print(img_url)
        print('title======',item['title'])
        if src_link:
            print('第一个if')
            src_link = response.xpath("//span[@onmouseover]/a/@href").extract_first()
            print("现在的src_link是",src_link)
            item['src_link'] = 'http://twlkbt.com/' + src_link
            print("现在的item['src_link']是",item['src_link'])
            yield item
            print("yiele ok")

        else:
            print('进入else块--')
            src_link = response.xpath("//a[@onmouseover=\"showMenu({'ctrlid':this.id,'pos':'12'})\"]/@href").extract_first()
            print("现在的src_link是",src_link)
            item['src_link'] = 'http://twlkbt.com/' + src_link
            print("现在的item['src_link']是",item['src_link'])
            yield item
            print('yield ok')
        #下载Torrent
</code>

结果在 前面一部分还没问题src_link正常的解析结果只有一个。 但是程序运行到中间 后面的部分 src_link就解析出2个元素了 所以导致结果出现问题
想了很久 想不到为什么同一个解析语句 到后面结果会一个变2个 (特别用scrapy shell 分别就结果正常网址 与 结果不正常网址做了测试 发现在shell里 同一个解析语句 解析结果又没问题 ,。。所以。。程序有问题?看不出来 囧。。。


下面是中间一部分不同结果运行信息 :
  
                 018-11-25 20:05:42 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://twlkbt.com/thread-86371-1-1.html> (referer: http://twlkbt.com/forum-2-1.html) ['partial']
外部src_link是: [<Selector xpath='//span[@onmouseover]/a/@href' data='forum.php?mod=attachment&aid=NDg2MjF8N2E'>]
title====== [11.24][中国][动作][新七侠五义之屠龙案][WEB.1080p-MKV/2G][国语中字][2018新片]
第一个if
现在的src_link是 forum.php?mod=attachment&aid=NDg2MjF8N2EzOTMwZTF8MTU0MzE0NzU0MHwwfDg2Mzcx
现在的item['src_link']是 http://twlkbt.com/forum.php?mod=attachment&aid=NDg2MjF8N2EzOTMwZTF8MTU0MzE0NzU0MHwwfDg2Mzcx
2018-11-25 20:05:42 [scrapy.core.scraper] DEBUG: Scraped from <200 http://twlkbt.com/thread-86371-1-1.html>
{'src_link': 'http://twlkbt.com/forum.php?mod=attachment&aid=NDg2MjF8N2EzOTMwZTF8MTU0MzE0NzU0MHwwfDg2Mzcx',
'title': '[11.24][中国][动作][新七侠五义之屠龙案][WEB.1080p-MKV/2G][国语中字][2018新片]'}
yiele ok
2018-11-25 20:05:43 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://twlkbt.com/thread-86117-1-1.html> (referer: http://twlkbt.com/forum-2-1.html) ['partial']
外部src_link是: [<Selector xpath='//span[@onmouseover]/a/@href' data='forum-37-1.html'>, <Selector xpath='//span[@onmouseover]/a/@href' data='forum.php?mod=attachment&aid=NDgzNDB8Mzg'>, <Selector xpath='//span[@onmouseover]/a/@href' data='forum-37-1.html'>]
title====== [10.18][美国][动作][第九禁区][高清BluRay.1080p-MKV/7G][国英双语中字][经典刺激]
第一个if
现在的src_link是 forum-37-1.html
现在的item['src_link']是 http://twlkbt.com/forum-37-1.html
2018-11-25 20:05:43 [scrapy.core.scraper] DEBUG: Scraped from <200 http://twlkbt.com/thread-86117-1-1.html>
{'src_link': 'http://twlkbt.com/forum-37-1.html',
'title': '[10.18][美国][动作][第九禁区][高清BluRay.1080p-MKV/7G][国英双语中字][经典刺激]'}
yiele ok
最佳答案
2018-11-26 20:16:29
fishclove 发表于 2018-11-26 19:53
改了你的这个xpath语句 就好了...
请问在写这个scrapy之前我用class类 同样的xpath语句 写的 ...

怎么说好呢??  
我不是通过网页审查元素写的xpath语句。  

我直接阅读网页源代码写的xpath语句。   

解析方法,像bs4、re、pq、xpath、pandas 等,有好几种变化,每个人写出来,有34种变化。  

变化的原因一般在网页源代码中。  
应该是由于这个网页有一点动态加载吧。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-25 20:53:09 | 显示全部楼层
求大佬指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-25 21:13:05 | 显示全部楼层

你到底想爬什么内容。能详细说一下吗??
我要分析一下页面内容的取法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-25 21:49:52 | 显示全部楼层
wongyusing 发表于 2018-11-25 21:13
你到底想爬什么内容。能详细说一下吗??
我要分析一下页面内容的取法

爬帖子的 标题文本 和 种子的链接地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-25 22:00:28 | 显示全部楼层
fishclove 发表于 2018-11-25 21:49
爬帖子的 标题文本 和 种子的链接地址

我想问的是那个区域里面的数据?  
转载区???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-25 22:13:05 | 显示全部楼层
分析了一下网页,感觉用re比xpath好。  

感觉你好像只是看审查元素,而没有看源代码的感觉。   

我从网页源代码中看到的结果是,你的xpath表达式好像是写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-25 22:52:34 From FishC Mobile | 显示全部楼层
wongyusing 发表于 2018-11-25 22:00
我想问的是那个区域里面的数据?  
转载区???

对 转载区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-25 22:54:16 From FishC Mobile | 显示全部楼层
wongyusing 发表于 2018-11-25 22:13
分析了一下网页,感觉用re比xpath好。  

感觉你好像只是看审查元素,而没有看源代码的感觉。   

啊 我在scrapy shell中测试了xpath语法的结果 就是种子链接 和 帖子标题 没错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-26 01:12:56 | 显示全部楼层
fishclove 发表于 2018-11-25 22:54
啊 我在scrapy shell中测试了xpath语法的结果 就是种子链接 和 帖子标题 没错

下面的是我写的xpath语句(好久没用xpath了,没测试过,你自己试试)
  1. //td[1]//span/a/@href
复制代码


稍微认真的看了一下你的代码,其实你一开始生成一个空字典。再yeild过去会比较好写。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-26 07:33:19 From FishC Mobile | 显示全部楼层
wongyusing 发表于 2018-11-26 01:12
下面的是我写的xpath语句(好久没用xpath了,没测试过,你自己试试)



额 我上电脑了试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-26 19:53:58 | 显示全部楼层
wongyusing 发表于 2018-11-26 01:12
下面的是我写的xpath语句(好久没用xpath了,没测试过,你自己试试)

改了你的这个xpath语句 就好了...
请问在写这个scrapy之前我用class类 同样的xpath语句 写的程序 下载就没有问题  为什么我为了熟悉下scrapy 写的程序 xpath语句就不行了呢。。。 下面是我之前写的 还麻烦大佬看看
   
  1. import requests
  2. from lxml import etree
  3. import os
  4. import time
  5. from hashlib import md5

  6. class  Twlk():# 1 page cost time 655s
  7.     headers = {
  8.         'user_agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
  9.     }

  10.     def __init__(self,url):
  11.         self.url = url

  12.     def get_response(self):
  13.         response = requests.get(self.url,headers = self.headers)
  14.         text = response.text
  15.         self.parse_page(text)

  16.     def parse_page(self,text):
  17.         html = etree.HTML(text)
  18.         href = html.xpath("//a[@class='xst']/@href")
  19.         #title = html.xpath("//a[@class='xst']/text()")
  20.         #获取单个电影详情页URL
  21.         for i in href:
  22.             stime = time.time()
  23.             page_link = 'http://twlkbt.com/{}'.format(i)
  24.             print('pagelink is:',page_link)
  25.             res2 = requests.get(page_link,headers = self.headers)
  26.             text2 = res2.text
  27.             html2 = etree.HTML(text2)
  28.             #get torrent link
  29.             src_link = html2.xpath("//span[@onmouseover]/a/@href")
  30.             title = html2.xpath("//*[@id='thread_subject']/text()")[0]
  31.             title = title.replace('/','-')
  32.             title = title.replace(':',' ')
  33.             img_url = html2.xpath("//img[@onclick='zoom(this, this.src, 0, 0, 0)']/@src")
  34.             print(img_url)
  35.             print(title)
  36.             if src_link:
  37.                 src_link = 'http://twlkbt.com/' + html2.xpath("//span[@onmouseover]/a/@href")[0]

  38.             else:
  39.                 src_link = 'http://twlkbt.com/' + html2.xpath("//a[@onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})"]/@href")[0]            
  40.             #下载Torrent
  41.             time.sleep(1)
  42.             res = requests.get(src_link,headers = self.headers)
  43.             goal = res.content
  44.             etime = time.time()
  45.             print('循环单次耗时::',etime - stime)
  46.             #若不存在则创建目录
  47.             path = "I:/IDM_Download/TWLK/%s/" %title
  48.             if not os.path.exists(path):

  49.                 os.makedirs(path)
  50.             file_path = path + title + '.torrent'
  51.             
  52.             #print(file_path)
  53.             if not os.path.exists(file_path):
  54.                 with open(file_path,'wb') as f:
  55.                     f.write(goal)

  56.             #get img content
  57.             for x in img_url:
  58.                 img_path = path + title + x.split('/')[-1]
  59.                 if x == 'static/image/common/back.gif':
  60.                     pass
  61.                 elif not os.path.exists(img_path):
  62.                     
  63.                     print("img_url is :",x)
  64.                     res_img = requests.get(x,headers= self.headers)
  65.                     print('1')
  66.                     img_goal = res_img.content
  67.                     print('即将打开路径')
  68.                     m = open(img_path,'wb')
  69.                     print('写入前——————')
  70.                     m.write(img_goal)

  71.                     print("img_goal save ok.")

  72.                     m.close()
  73.                     

  74.             print('save %s success' %title,'\n')

  75.         
  76.         


  77.     def run(self):
  78.         #获取主题网页
  79.         self.get_response()

  80.         #获取标题title主题网页src_link
  81.         print('开始解析页面')
  82.       



  83. def timecount(func):
  84.     def wrapper():
  85.         timestart = time.time()
  86.         print(timestart)
  87.         func()
  88.         timeend = time.time()
  89.         print(timeend)
  90.         timecost = timeend - timestart
  91.         print("time cost is %s" %timecost)
  92.     return wrapper


  93. @timecount
  94. def main():
  95.     #构造URL

  96.     for x in range(2,4):
  97.         url = 'http://twlkbt.com/forum-2-%s.html' %str(x)
  98.         print(url)

  99.         twlk = Twlk(url)
  100.         twlk.run()
  101.         print("%s ------------- 已下载完成!" %url)


  102. if __name__ == "__main__":
  103.     main()

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-26 20:16:29 | 显示全部楼层    本楼为最佳答案   
fishclove 发表于 2018-11-26 19:53
改了你的这个xpath语句 就好了...
请问在写这个scrapy之前我用class类 同样的xpath语句 写的 ...

怎么说好呢??  
我不是通过网页审查元素写的xpath语句。  

我直接阅读网页源代码写的xpath语句。   

解析方法,像bs4、re、pq、xpath、pandas 等,有好几种变化,每个人写出来,有34种变化。  

变化的原因一般在网页源代码中。  
应该是由于这个网页有一点动态加载吧。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-26 20:44:33 | 显示全部楼层
wongyusing 发表于 2018-11-26 20:16
怎么说好呢??  
我不是通过网页审查元素写的xpath语句。  

谢谢你 你能说一下你的xpath吗  开头的td[1]是什么意思 我看源代码有好多td
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-26 21:55:00 | 显示全部楼层
fishclove 发表于 2018-11-26 20:44
谢谢你 你能说一下你的xpath吗  开头的td[1]是什么意思 我看源代码有好多td

应该是选择第一个td吧

昨天无聊,随便写的。

今天不想看网页源代码。自己去查查文档吧,应该不是很深奥吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 05:15:11 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 10:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表