使用scrapy进行页面抓取

安装python3

windows:略
linux 的可以用官网的源码安装,也可以用apt-get 或yum等安装

wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
tar Jxvf Python-3.6.5.tar.xz
cd Python-3.6.5
./configure --prefix=/usr/local/python3.6   --with-ssl
make && make install
ln -s /usr/local/python3.6/bin/python3.6 /usr/bin/python3

# 有可能 需要 
sudo apt-get install zlib
sudo apt-get install zlib1g-dev

关于虚拟环境的搭建,

安装 virtualenv
pip install virtualenv

virtualenv 不管是在py2还是py3都可以安装

如果安装 出现找不到这个命令,则可看下
/usr/local/python3.6/bin/virtualenv
然后 sudo ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv

新建到当前目录的虚拟环境

virtualenv scrapytest
virtualenv -p c://…/python.exe abc
可以进入目录 里面有目录 ,

####怎么进入和退出这个虚拟环境?
到Scripts 目录下 activate.bat
如果是linux 则source activate

在里面的时候退出deactivate.bat

怎么选择一个 python版本?

virtualenv -p xxx\python.exe aaatest

但是创建virtual比较麻烦,要进入里面的路径,比较麻烦,所以现在使用

pip install virtualenvwrapper

加到环境变量中

WORKON加到环境变量中,

如果在linux:
下面这些可扔到~/.bashrc中,
或者自己执行,嗯,不过路径 可以自己选,同时,virtualenvwrapper.sh这个文件不一定在这个目录 ,如果不在这里也可以去 python/bin里面找,下

export WORKON_HOME=$HOME/.virtualenvspwd
export VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
export PROJECT_HOME=$HOME/devel
source /usr/local/bin/virtualenvwrapper.sh

上面保存后, source ~/.bashrc

卸载pip安装的软件?

pip uninstall virtualenvwrapper

安装完 virvirtualenvwrapper后怎么使用不了workon???

在 WINDOWS 下面要运行命令 pip install virtualenvwrapper-win才行

使用这个命令?

workon 直接输入这个命令,则其会直接显示list

指定workon的目录?

增加一个环境变量.WORKON_HOME (改了环境变量要重启cmd.)

直接进入虚拟环境?

workon aaaatest

在workon环境中怎么退出?

deactivate

删除环境

rmvirtualenv aaatest

如果出现library错了,如,我在py3中安装scrapy 出现 了“Failed building wheel for Twisted”

地址: www.lfd.uci.edu/~gohlke/pythonlibs/
找到对应的版本,如lxml 下载来来为一个whl文件,pip install xxxx.whl

查看安装了哪些包 ?

pip list

指定具体的python新建虚拟环境,如建立 p3环境时

mkvirtual --python= xxxx\python.exe p3
如:
mkvirtualenv --python=E:\python36\python.exe p3scrapy
mkvirtualenv --python=E:\python27\python.exe p2scrapy

初始开发scrapy

安装scrapy相关库

pip install scrapy

怎么新建一个scrapy ?

进入一个虚拟环境,在一个目录上执行scrapy startproject myspider xxx.com

生成的结构说明

items.py 获取数据的item,类似 于java bean ,一般用其来存抓取到的数据pojo
middlewares.py 自定义的各种中间件,scrapy也默认了一些中件间,主要分为downloadmiddleware 和 spiddermiddleware
pipelines.py 能直接接收到item,后处理数据,存储数据的方法
settings.xml,各种配置,如默认的那些中间件的控制参数等

说明: 生成的这个结构只是一个框架,还并没有具体的逻辑

pycharm中导入自定义的环境.

我们前面已经有 virtualenv了,要用pycharm将其导入进来:
这里写图片描述

新建一个spider任务

scrapy genspider anjuke_gz anjuke.com
之后会生成一个 anjuke_gz.py ,这个里面就是具体写逻辑的

一些配置和helloworld

设置user_agent,关闭robot协议服从,间隔时间

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

DOWNLOAD_DELAY = 0.2

AnjukeGzSpider.py改成如下

# -*- coding: utf-8 -*-
import scrapy


class AnjukeGzSpider(scrapy.Spider):
name = 'anjuke_gz'
allowed_domains = ['anjuke.com']
start_urls = ['https://guangzhou.anjuke.com/sale/']

def parse(self, response):
items = response.css("#houselist-mod-new > li")

for itemnode in items:
itemurl = itemnode.css('a.houseListTitle::attr(href)').extract()
itemtitle = itemnode.css('a.houseListTitle::attr(title)').extract()
print ('%s,链接为:%s'%(itemtitle[0],itemurl[0]))
pass

使用命令行执行:
scrapy crawl anjuke_gz

结果:

珠光山水城 ,户型方正实用,首付仅需45万,链接为:https://guangzhou.anjuke.com/prop/view/A1286396595?from=filter&spread=commsearch_p&position=16&kwtype=filter&now_time=1529210164
益鹏翠苑  精装舒适三房 南向朝花园 成熟商圈 改善置换优选,链接为:https://guangzhou.anjuke.com/prop/view/A1271978829?from=filter-saleMetro&spread=commsearch_p&position=17&kwtype=filter&now_time=1529210164
凤凰城凤妍苑 东南向3房一线别墅景观无边 可伶包入住,链接为:https://guangzhou.anjuke.com/prop/view/A1283839704?from=filter&spread=commsearch_p&position=18&kwtype=filter&now_time=1529210164
VR全景 总价低 读名校亲身体验看房 价位可谈,链接为:https://guangzhou.anjuke.com/prop/view/A1286447013?from=filter-saleMetro-salesxq&spread=commsearch_p&position=19&kwtype=filter&now_time=1529210164
小北大厦  原装电梯高层 77方仅售490万 省级小北路小学,链接为:https://guangzhou.anjuke.com/prop/view/A1284096654?from=filter-saleMetro-salesxq&spread=commsearch_p&position=20&kwtype=filter&now_time=1529210164
江畔华庭 滨江东难得江景三房 业主自住多年保养好 看房提前预,链接为:https://guangzhou.anjuke.com/prop/view/A1286434692?from=filter-saleMetro-salesxq&spread=commsearch_p&position=21&kwtype=filter&now_time=1529210164
新上星河湾二期 南北对流小三房 南向客厅 方便看房,链接为:https://guangzhou.anjuke.com/prop/view/A1285496073?from=filter&spread=commsearch_p&position=22&kwtype=filter&now_time=1529210164
市桥东明园 证过五带学位  产权清晰 业主诚心出售,链接为:https://guangzhou.anjuke.com/prop/view/A1272911841?from=filter-saleMetro-salesxq&spread=commsearch_p&position=23&kwtype=filter&now_time=1529210164
周末可看,时代云图,,67平方,178万,高层,,读金隆小学,链接为:https://guangzhou.anjuke.com/prop/view/A1272305772?from=filter&spread=commsearch_p&position=24&kwtype=filter&now_time=1529210164
市桥竹溪街独栋别墅 附送200方大花园比市场价便宜80万,链接为:https://guangzhou.anjuke.com/prop/view/A1263155328?from=filter&spread=commsearch_p&position=25&kwtype=filter&now_time=1529210164
南沙繁华商务中心 醉新货 碧桂园 近金州繁华商圈 精装三房,链接为:https://guangzhou.anjuke.com/prop/view/A1286149977?from=filter&spread=commsearch_p&position=26&kwtype=filter&now_time=1529210164
白云石井小区 急售 楼下生活超市 满五 采光好 带车位,链接为:https://guangzhou.anjuke.com/prop/view/A1280131929?from=filter&spread=commsearch_p&position=27&kwtype=filter&now_time=1529210164
金悦东山 2房2厅精装修 采光好 成熟小区 省级先烈中近地铁,链接为:https://guangzhou.anjuke.com/prop/view/A1286249877?from=filter&spread=commsearch_p&position=28&kwtype=filter&now_time=1529210164
水路聚财宝宅工商利剑在握 270度江景泳池珠江水中游,链接为:https://guangzhou.anjuke.com/prop/view/A1285890552?from=filter-saleMetro&spread=commsearch_p&position=29&kwtype=filter&now_time=1529210164
.....

注意:
1,settings.py中 ROBOTSTXT_OBEY = False 要设置好
2,出现"No module named ‘win32api’"时?
安装pip install pypiwin32

为了方便调试,新建一个main.py,和scrapy.cfg同级
from scrapy.cmdline import execute
import sys,os
print (os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(['scrapy','crawl','anjuke_gz'])

使用命令行进行调式

有时在浏览器看到的和代码中的response不一样,是因为代码中的response是html请求而浏览器可能有一些其它js进行渲染,我们可以采用命令行来调试,保证返回的html和 代码中的reponse是一样的

文档:https://doc.scrapy.org/en/latest/topics/commands.html


scrapy shell https://scrapy.org/
>response.text

对response 进行处理,小技巧

在处理字符串时(或元素为字符串的列表),考虑下列常见用法:

  1. 正则表达式
  2. 字符串的strip方法,去空格
  3. 字符串的replace方法,
  4. 字符串转数组:split方法
  5. 过滤列表中的一些元素:列表生成式
  6. (元素为字符串的)数组转字符串:join方法

使用一些正则表达式
import re
match_re = re.match(".(\d+).",“1 收藏”)
if match_re:
print match_re.group(1)

两个字符串方法:

  1. str.startwith(string,[start=0,end=len(string)])
  2. str.endwith(string,[start,end])

对[“xxxx”,“2 评论”,“xxxx”],找到对应的数字,可如下:
tag_list = [element for element in tag_list if not element.strip().endswith(“评论”)]
tags = “,”.join(tag_list)

参考

https://coding.imooc.com/class/92.html
https://scrapy.org/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值