使用爬虫的小技巧
程序员文章站
2022-07-02 15:35:08
...
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.安装python和msyql的驱动: 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 就可以进入到里面了。