尝试用scrapy提取网页中的网址

尝试用scrapy提取网页中的网址,但是每次提取的都是另外一个地址,而网址旁边的文本可以正常提取,所以我判断我代码没问题,应该是目标网站有些什么措施把爬虫带到坑里了。我是... 尝试用scrapy提取网页中的网址,但是每次提取的都是另外一个地址,而网址旁边的文本可以正常提取,所以我判断我代码没问题,应该是目标网站有些什么措施把爬虫带到坑里了。我是刚学的这个,不知道这个问题该用什么术语来描述?可以看我的附图理解我的问题。前图是我试图获取的地址,后图是我试代码的时候返回的地址。我试过将整个脚本执行了,也是一样的结果,得不到正确地址。这样获取到的数据表格就是文本是想要的,但是对应的网址却到不了对应的文本内容。求指教,谢谢。 展开
 我来答
龙氏风采
2017-01-01 · 知道合伙人互联网行家
龙氏风采
知道合伙人互联网行家
采纳数:5849 获赞数:12817
从事互联网运营推广,5年以上互联网运营推广经验,丰富的实战经

向TA提问 私信TA
展开全部
  Selector选择器
  在Scrapy中,也可以使用BeautifulSoup来解析网页,但是,我们推荐使用Scrapy自带的Selector选择器来解析网页,没别的原因,效率高。Selector选择器有XPath方法和css方法两种选择方法,我使用的是XPath方法。
  XPath
  XPath 是一门在 XML 文档中查找信息的语言。因为网上的教程有很多,在此处推荐两个,我自己就不多讲了。一个菜鸟教程的XPath文字教程,一个是极客学院的XPath视频教程,后者需要实名认证一下就可以观看,也不麻烦,个人比较推崇后者,老师讲的很易懂。相信我,根据教程只需要半个小时你就能明白XPath,再根据下面我的代码对照巩固一下,你就能掌握它了。
  使用Chrome分析网页
  我们使用Chrome浏览器(firefox也是类似的)来分析网页,分析我们的XPath该怎么去写,比如说我们现在要分析帖子的标题
  右键帖子标题,选择检查
  检查
  此时,Chrome的调试工具会跳出来,并且自动定位到源代码中我们要检查的元素的位置
  检查2
  之后根据代码结构我们很轻松的就得出其XPath
  //*[@id="thread_subject"]/text()
  1
  其实在某些时候也可以直接右键元素,选择copy xpath,但是这种方法在实践中用处基本为零,因为很难去找出多个网页的共同特质,所以一般情况下我们还是要自己去分析。
  自动生成
  在这里有必要提醒一个神坑,在下面代码中也有体现,详见我从前写的这篇文章Scrapy匹配xpath时tbody标签的问题
  这个坑给我的启示是,当发现了感觉不能用科学解释的错误的时候,就检查一下获取到的源代码吧!
  代码
  不说废话了,直接上代码。
  首先,修改items.py文件,定义好我们要提取的内容
  # -*- coding: utf-8 -*-
  import scrapy
  class HeartsongItem(scrapy.Item):
  title = scrapy.Field() # 帖子的标题
  url = scrapy.Field() # 帖子的网页链接
  author = scrapy.Field() # 帖子的作者
  post_time = scrapy.Field() # 发表时间
  content = scrapy.Field() # 帖子的内容
  然后来到heartsong_spider.py,编写爬虫
  # -*- coding: utf-8 -*-
  # import scrapy # 可以写这句注释下面两句,不过下面要更好
  from scrapy.spiders import Spider
  from scrapy.selector import Selector
  from heartsong.items import HeartsongItem # 此处如果报错是pyCharm的原因
  class HeartsongSpider(Spider):
  name = "heartsong"
  allowed_domains = ["heartsong.top"] # 允许爬取的域名,非此域名的网页不会爬取
  start_urls = [
  "http //www.heartsong.top/forum.php?mod=viewthread&tid=8" # 起始url,此例只爬这个页面
  ]
  def parse(self, response):
  selector = Selector(response) # 创建选择器
  table = selector.xpath('//*[starts-with(@id, "pid")]') # 取出所有的楼层
  for each in table: # 对于每一个楼层执行下列操作
  item = HeartsongItem() # 实例化一个Item对象
  item['title'] = selector.xpath('//*[@id="thread_subject"]/text()').extract()[0]
  item['author'] = \
  each.xpath('tr[1]/td[@class="pls"]/div[@class="pls favatar"]/div[@class="pi"]/div[@class="authi"]/a/text()').extract()[0]
  item['post_time'] = \
  each.xpath('tr[1]/td[@class="plc"]/div[@class="pi"]').re(r'[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+')[0].decode("unicode_escape")
  content_list = each.xpath('.//td[@class="t_f"]').xpath('string(.)').extract()
  content = "".join(content_list) # 将list转化为string
  item['url'] = response.url # 用这种方式获取网页的url
  # 把内容中的换行符,空格等去掉
  item['content'] = content.replace('\r\n', '').replace(' ', '').replace('\n', '')
  yield item # 将创建并赋值好的Item对象传递到PipeLine当中进行处理
  最后到pipelines.py中保存爬取到的数据:
  # -*- coding: utf-8 -*-
  import heartsong.settings
  class HeartsongPipeline(object):
  def process_item(self, item, spider):
  file = open("items.txt", "a") # 以追加的方式打开文件,不存在则创建
  # 因为item中的数据是unicode编码的,为了在控制台中查看数据的有效性和保存,
  # 将其编码改为utf-8
  item_string = str(item).decode("unicode_escape").encode('utf-8')
  file.write(item_string)
  file.write('\n')
  file.close()
  print item_string #在控制台输出
  return item # 会在控制台输出原item数据,可以选择不写
  运行
  依旧进入项目目录,在终端输入
  scrapy crawl heartsong
  1
  看一下输出的信息,没问题。
  输出
  看一下生成的本地文件,也ok。
  本地文件
  本地文件2
  小结
  本部分介绍了页面解析的方法,下一部分将会介绍Scrapy爬取多个网页,也是让咱的爬虫真正爬起来的一部分。结合这两节,你就能将我的论坛上的所有帖子都爬下来了。
追问
其实,这个我也可以去学,我的问题不在这里。我是想问我要的是一个网址,为什么网站给了我另一个。怎么解决这个问题?还有你这个答案都是贴的别人的。
AiPPT
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图... 点击进入详情页
本回答由AiPPT提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式