scrapy积累

构造url :和pyspider一样方便,具体实现用parse一层一层解析url 到最终一层之后爬取

# 使用带数字的url 用列表表达式
start_urls = ['http://www... /p' + str(x) for x in range(3, 6, 1)] 
# 使用翻页,基本上属于解析范畴,因为要找到翻页的按钮
        next = response.css('.next::attr(href)').extract()
        url = response.urljoin(next[0])
        yield scrapy.Request(url=url, callback=self.parse, dont_filter=True)
#传入list,受到了列表表达式的启发,同时视频教程知乎会员的也有类似的,先贴关键代码。
list = ['目标1','目标2','目标n']
for l in list:
    urls = ['url前面部分' + 目标部分]
    print (urls)
#下面这个貌似更好,从源码解读出来的 首先从start_requests开始
class demoSpider(RedisSpider):
    name = "demospider"

    redis_key = 'demospider:start_urls'
    start_urls = ['http://www.example.com']

    def start_requests(self):
        pages=[]
        for i in range(1,10):
            url='http://www.example.com/?page=%s'%i
            page=scrapy.Request(url)
            pages.append(page)
        return pages

下面这个是ok的,并且还给了一个提示:即url构造和页面解析可以分成不同的模块,对于写代码来说,callback已经体现了这个思想,但对于产品来说,可以打造两个模块
上代码:
class projectSpider(scrapy.Spider):
    name = 'projectname'
    allowed_domains = ['url']
    start_urls = ['targeturl']

#下面是传入一个url的list:
    def start_requests(self):
        rllist = ['url1','urln']
        for rl in rllist:
            yield Request(rl, callback=self.parse_url)

#下面是从每个url打开的获取新的url
    def parse_url(self, response):
        for url in response.css('解析规则::attr(href)').extract():
            yield Request(url, callback=self.parse_detail)

#下面是最终的页面解析
    def parse_detail(self, response):
        item = DpItem()
        name = response.css('.shop-name::text').extract()
        item['name'] = name
        #这里可以根据需要添加更多的内容,既可以是字段也可以是翻页。
        yield item
        

使用scrapy的时候,用了start_requests()循环生成要爬取的网址,还需要写start_urls吗? 应该不需要了,start_url是入口页。

**注意:**递归爬取解析url时不能用 def start_requests(self),因为其中没有reponse 因此无法解析url,这个只是用来构造不从网页解析url的时候用的,可以参考崔庆才爬取知乎的视频教程

递归爬取URL:首先要用含有response的parse工具构建一个方法解析出来url,然后在callback 目标页面
def parse(self, response):  
        for href inresponse.css("ul.directory.dir-col > li > a::attr('href')"):  
#获取当前页面的url:respone.url  
#通过拼接response.url和href.extract(),将相对网址转换为绝对网址  
            url =response.urljoin(response.url, href.extract())  
            yield scrapy.Request(url, callback=self.parse_dir_contents)  

解析

#phantomjs 点击等元素的操作均在此中
from selenium import webdriver
from scrapy.http import HtmlResponse
import time

class dianpingSpiderMiddleware(object):
    def process_request(self, request, spider):
        if spider.name == "项目名称":   # 注意更换此处的名称,另外估计模拟操作都是在这里
            print ('PhantomJS is starting...')
            driver = webdriver.PhantomJS() #指定使用的浏览器
            # driver = webdriver.Firefox()
            driver.get(request.url)
            time.sleep(1)
            js = "var q=document.documentElement.scrollTop=10000"
            driver.execute_script(js) #可执行js,模仿用户操作。此处为将页面拉至最底端。
            time.sleep(3)
            #这里可以添加交互,例如搜索框输入,点击等
            body = driver.page_source
            print ("访问"+request.url)
            return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)
        else:
            return

具体请见:Scrapy+Selenium+Phantomjs的Demo

#如何用scrapy提取不在标签内的文字?
response.xpath(u'//span[contains(./text(), "出版社:")]/following::text()[1]') #xpath
response.doc(u'span:contains("出版社:")')[0].tail #pyquery

提取某个区块内的文本,css返回的需要先extract,见下图

for list1 in lists:
text1 = list1.extract()
zhengze = re.findall(r’’‘前截(.*?)后截’’’, text1, re.S)

更多请见 https://www.zhihu.com/question/38080188

不断加,遇到新的再添加

**

终端内2.7 操作3.5

升级demjson遇到了证书问题,原来是要pip从9版本升级到10以上才能解决,正解如下:

sudo curl https://bootstrap.pypa.io/get-pip.py >> get-pip.py  # 主流这样
curl https://bootstrap.pypa.io/get-pip.py | python3 # 这样将安装在系统自带的python2.7的路径下,而我们要的开发环境却是python3

参考: mac下pip的安装,入python的坑,都离不开pip

mac升级pip报错There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值