构造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]