scrapy爬虫获取网页特定内容

上次把scrapy环境配置好了,这次试着来做些实际的东西。

关于scrapy抓取网页的文章已经有很多了,但大多数的内容已经过期,不再适用于最新的scrapy版本,故在此另作一文,记录学习过程。

目标是一个政府网站,红框内的部分。

思路很简单:

有了url之后,用xpath表达式提取出来,再写到文件里即可

如果之前没有scrapy的经验,可以先看看这两篇文章:

http://www.cnblogs.com/txw1958/archive/2012/07/16/scrapy-tutorial.html

教你快速上手一个scrapy项目

以及

http://www.ituring.com.cn/article/114408

教你从豆瓣上抓取电影信息

值得注意的是,第二篇文章里的有些方法已经不推荐使用,这里做了改进

talk is cheap,show me the code:

#coding=utf-8  

import sys
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
import json
reload(sys)
sys.setdefaultencoding(‘utf8‘)  

class DmozSpider(BaseSpider):
    name = "dmoz"
    allowed_domains=[""]
    start_urls=["http://www.jjkjj.gov.cn/"]

     def parse(self,response):
        filename = response.url.split("/")[-2]
        titles=[]                                   titles.extend(response.selector.xpath(‘//div[@class  ="Work_News_line"]/a/text()‘).extract())

        open(filename,‘w‘).write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))

下面来分析代码:

from scrapy.spider import BaseSpider

这里是基于单个页面的抓取,因此使用BaseSpider,基于链接跳转的爬虫可以看一下第二篇文章

    name = "dmoz"
    allowed_domains=[""]
    start_urls=["http://www.jjkjj.gov.cn/"]

start_urls就是主域名,

因此allowed_domain设置为空

 def parse(self,response):
        filename = response.url.split("/")[-2]
        titles=[]                                     titles.extend(response.selector.xpath(‘//div[@class  ="Work_News_line"]/a/text()‘).extract())

这个markdown编辑器缩进有点问题,titles.extend…这一行应该和上面一行保持同一缩进,不然会报出

Python运行错误,raise notImplementedError

当遇到这种错误时,检查下缩进,一般就能解决

接下来看xpath表达式,

具体含义为:找到class属性为”Work_News_line”的div,其下面的<a>标签的值

extract()函数 返回一个unicode字符串,该字符串为XPath选择器返回的数据

关于xpath的使用,还有一些需要注意的地方

在上面第二篇文章中,使用xpath的方式是:

sel=Selector(response)                                          item=DoubanmoiveItem()          item[‘name‘]=sel.xpath(‘//[@id="content"]/h1/span[1]/text()‘).extract()

新版本的scrapy不建议这样使用

因此我改成了上面的写法

接下来是最头疼的中文显示问题了

在shell里面看看xpath的查询结果:

一堆Unicode字符,其实这样也算抓取成功了,但基本上不可用,还是需要将其转化成中文。

感觉scrapy,乃至python在字符集这一块做得都不是很好,

再来看上面的代码:

titles=[]                                      titles.extend(response.selector.xpath(‘//div[@class  ="Work_News_line"]/a/text()‘).extract())

这里声明了一个列表,每查询到一个值,就将其放到列表里,然后需要将这个列表转成字符串写入文件。

python本身提供了str()方法,用于将任意对象转换成字符串,但没有对中文提供支持,转出来的字符串还是unicode编码。

具体见这篇帖子:str字符串转化

有一种解决办法是利用python自带的json模块

open(filename,‘w‘).write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))

这样就ok

我们把抓到的数据写到了文件里面,下面看看结果:

时间: 2024-08-28 14:17:00

scrapy爬虫获取网页特定内容的相关文章

03 爬虫实例-获取网页弹幕内容

练习:爬取哔哩哔哩网页弹幕内容,并将爬取的内容以五角星的形式显示出来 思路: 向哔哩哔哩网站发送请求 请求成功后,解析爬取的弹幕内容保存到一个文件中 读取文件并分析弹幕内容中词组或文字出现的频率 将这些词组或文字组成五角星图形 组成五角星图形后,以图片的形式输出 实现: 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # author:albert time:2019/10/28 4 import requests 5 from bs4 i

Java 网络爬虫获取网页源代码原理及实现

Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件. 2.那么程序获取网页的原理到底是怎么回事呢?看下面的图:客服端首先向服务器端发出Http请求,之后服务器端返回相应的结果或者请求超时客户端自己报错. 服务器端发出的Http请求,实际上说是对服务器的文件的请求

telnet建立http连接获取网页HTML内容

利用telnet可以与服务器建立http连接,获取网页,实现浏览器的功能. 它对于需要对http header进行观察和测试到时候非常方便.因为浏览器看不到http header. 步骤如下: telnet www.csua.berkeley.edu 80 输入GET /officers.html HTTP/1.0 并2次回车. 这时就应该可以看到http response了,包括了header和body. 因为window自己带到telnet在输入内容的时候看不到输入的内容,可以下载putty

java 获取网页指定内容

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpTest { String urlString; public static void main(String[] args) throws Exception { HttpTest client = new HttpTes

python3获取一个网页特定内容

我们今天要爬取的网址为:https://www.zhiliti.com.cn/html/luoji/list7_1.html 一.目标:获取下图红色部分内容 即获取所有的题目以及答案. 二.实现步骤. 分析:1,首先查看该网站的结构. 分析网页后可以得到: 我们需要的内容是在该网页<li>标签下,详细内容链接在<small>的<a>的href中. 但是这样我们最多只能获取这一页的内容 别着急 我们点击第二页看一下目标网址有什么变化 我们发现目标网址最后的数字变成了2 再

Python3爬虫04(其他例子,如处理获取网页的内容)

#!/usr/bin/env python# -*- coding:utf-8 -*- import osimport reimport requestsfrom bs4 import NavigableStringfrom bs4 import BeautifulSoup res=requests.get("https://www.qiushibaike.com/")qiushi=res.contentsoup=BeautifulSoup(qiushi,"html.pars

php利用curl获取网页title内容

<?php $url = 'http://www.k7wan.com'; echo getTitle_web_curl($url); function getTitle_web_curl($url){ $title = ''; $ch = curl_init(); //设置选项,包括URL curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLO

C++ 与 php 的交互 之----- C++ 异步获取 网页文字内容,异步获取 php 的 echo 值。

转载请声明出处! http://www.cnblogs.com/linguanh/category/633252.html 距离上次 谈 C++ 制作json 或者其他数据传送给 服务器,时隔两个多月. 链接:http://www.cnblogs.com/linguanh/p/4340119.html 这次是从服务器上 中获取 文字内容到控制台,或者写入本地文本等操作,废话不多说,开讲. ------------------------------------------------------

C++ 与 php 的交互 之----- C++ 获取 网页文字内容,获取 php 的 echo 值。

转载请声明出处! http://www.cnblogs.com/linguanh/category/633252.html 距离上次 谈 C++ 制作json 或者其他数据传送给 服务器,时隔两个多月. 链接:http://www.cnblogs.com/linguanh/p/4340119.html 这次是从服务器上 中获取 文字内容到控制台,或者写入本地文本等操作,废话不多说,开讲. ------------------------------------------------------