使用爬虫的小技巧

1.xpath的几种取值用法:

response.xpath('//*[@id="post-110287"]/div[1]/h1/text()').extract()

'//span[contains(@class, "yangshi")]/text()' #包含关系
'//span[@href="lianjie"]/h1/text()'
'//span[@id="post-110287"]/div[1]/h1/text()'
'//span[@class="entry-header"]/h1/text()'
response.xpath(u'//a[text()="下一页"]/@href').extract()  #直接文本相等  python2下,出现中文需要前面加u
response.xpath(u'//a[contains(text(),"下一页")]/@href').extract()  #文本间是包含关系 python2下,出现中文需要前面加u

//input[starts-with(@name,'name1')]     查找name属性中开始位置包含'name1'关键字的页面元素

//input[contains(@name,'na')]         查找name属性中包含na关键字的页面元素


2.css的几种取值方法:

response.css(".entry-header h1::text").extract() # .代表的是class #代表的是id
response.css('p.entry-meta-hide-on-mobile::text').extract()
response.css('a[href="#article-comment"]::text').extract()[0]
response.css('#archive .floated-thumb .post-thumb a::attr(href)').extract_first('') a标签的href属性取值;默认为空

response.css('.next.page-numbers::attr(href)').extract_first('空') 一个标签下的两个class,之间不需要空格进行连接

3.对比extract_first()和extract()[0],需要是最好采用extract_first()
extract_first()是代表取出数组里面的第一个数据,可以不用考虑异常情况;
extract()[0]也是代表取出数组里面的第一数据,但是异常情况处理不了;

4.url相加的方法:
from urllib import parse  #这是在python3中调用;
import urlparse  #这是在python2中的调用;
parse.urljoin(base,url)  #将url进行相加
5.获取meta中的数据
meta是Request函数中传入的参数值,传递到下一个函数,我们可以这样取值:
response.meta.get('image_url', '')  #使用get方法获取meta中的数据,不会报异常
response.meat['image_url','') #这样容易报异常。
6.ImagesPipeline 的使用方法:
第一步:
ITEM_PIPELINES = {
   'first_project.pipelines.FirstProjectPipeline': 300,
   'scrapy.pipelines.images.ImagesPipeline':1,  #配置ImagesPipeline
}
IMAGES_URLS_FIELD = 'get_image_url'  #将对准下载图片的url字段
BASE_DIR = os.path.abspath(os.path.dirname(__file__))  #获取和spider同级的路径,__file__代表的setting文件路径;
IMAGES_STORE = os.path.join(BASE_DIR, 'images')  #存放图片的下载路径
# IMAGES_MIN_HEIGHT = 100  #设置图片的最小高度,
# IMAGES_MIN_WIDTH = 100  #设置图片的最小宽度,
第二步:在和spdier同级的目录下创建一个images文件夹,用于存放图片。
第三步:要想使用和图片相关的模块,就需要安装PIL库, 终端命令:pip install pillow
第四步:安装完成后,运行项目,会报一个错:raise ValueError('Missing scheme in request url: %s' % self._url)
这是因为下载图片的时候,IMAGES_URLS_FIELD 里面的值会作为数组来处理,所以我们在spider中,将字段get_image_url 改为数组
类型即可。
这样基本完成imagepipeline,接下来,我们可以通过程序获取image的存储路径:
在pipelines.py文件中,继承ImagesPipeline
from scrapy.pipelines.images import ImagesPipeline
class JobbolePipeline(ImagesPipeline): #获取图片存储的路径;
    def item_completed(self, results, item, info):
        for ok, value in results:
            image_file_path = value['path']
        item['get_image_path'] = image_file_path

        return item
路径就会存入item中。
7.对数据字段进行md5加密:
在我们自己常用的工具包下创建common.py文件:
import hashlib

def get_md5(url):  #md5加密函数
    if isinstance(url, str):
        # python3中的str是unicode类型的
        url = url.encode('utf-8')
    m = hashlib.md5()
    m.update(url)  #url不能是unicode类型的,
    return m.hexdigest()
完成函数后,我们可以在spdier中使用它,来加密我们的数据;
8.将数据写入json文件中:
在pipelines.py文件中,创建类如下:
import codecs
import json
class JsonWithEncodingPipeline(object):
    def __init__(self):
        #codecs读取文件的包,比open包好用点
        self.file = codecs.open('article.json', 'w', encoding='utf-8') #两个控制编码的
    def process_item(self, item, spider):
        lines = json.dumps(dict(item), ensure_ascii=False) + "\n"  #控制编码的
        self.file.write(lines)
        return item
    def spider_closed(self, spider):
        self.file.close()  #关闭文件流
然后在setting.py文件中,的ITEM_PIPELINES添加我们刚刚写的JsonWithEncodingPipeline
9.安装pythonmsyql的驱动:
windows下安装:命令行执行 pip install -i https://pypi.douban.com/simple/ mysqlclient
ubuntu 下安装:终端执行 pip install -i https://pypi.douban.com/simple/ mysqlclient 这样会出现一个错误,
我们先执行:sudo apt-get install libmysqlclient-dev ,然后执行刚刚那行命令。
10.ItemLoader函数使用
from scrapy.loader import ItemLoader
item_loader = ItemLoader(item=JobboleItem(), response=response)
        # item_loader = JobboleItemLoader(item=JobboleItem(), response=response) #使用自定义的itmeloader
        item_loader.add_css('title', 'div.entry-header h1::text') #为字段添加css抓取, 还有add_xpath()是为字段添加xpath抓取
        item_loader.add_value('get_image_url', [get_image_url]) #为字段赋值
        item_loader.add_value('url_object_id', get_md5(response.url))
        item = item_loader.load_item()
        yield item
还可以在items.py文件中,对itme进行预处理:
from scrapy.loader.processors import MapCompose, TakeFirst
class JobboleItem(scrapy.Item):
    title = scrapy.Field(
        input_processor= MapCompose(lambda x:x + ".jobbole我的后缀" ,add_jobbole),               #当title从item传过来后,对值进行预处理。
        output_processor = TakeFirst()   #只去list中的第一个数据;
    )
    get_image_url = scrapy.Field()
    get_image_path = scrapy.Field()
    url_object_id = scrapy.Field()

    pass
11.python2和python3的兼容导包方式:
try:
    import cookielib
except:
    import http.cookiejar as cookielib
12.设置pycharm默认编码:

13.在spider爬虫的py文件中,我们要记得导入这个编码包:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
今天在这里坑了。
14.scrapy shell 的使用:
scrapy shell https://www.baidu.com
当需要使用user-agent的时候
scrapy shell -s USER_AGENT="" https://www.baidu.com

15.使用python中filter函数来过滤掉list中不需要的url
#all_urls 是一个list类型,将all_urls进行遍历,为True的就放入all_urls里面,为False的就过滤掉
all_urls = filter(lambda x:True if x.startswith('https') else Flase, all_urls)
16.在pipeline中获取item的名称:
item.__class__.__name__ == 'JobboleItem'
17.telnet的简单使用:
首先我们打开控制面板,进入到程序和功能,点击打开或关闭windows功能。里面有个telnet服务器,和telnet客户端,将这两个文件夹

打上勾,点击确认,就会自动添加安装,如果需要重启电脑就进行重启,
然后运行我们的scrapy项目,开始运行后会有监听端口打开:

开启我们的cmd,输入命令:telnet localhost 6023 就可以进入到里面了。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值