爬虫学习笔记

2018-11-13

1.爬虫:模拟客户端(浏览器)发送网络请求,获取响应,按照规则提取数据的程序。

模拟客户端(浏览器)发送网络请求:照着浏览器发送一模一样的请求,获取和浏览器一模一样的数据

2.爬虫的数据去哪了?

---呈现出来:展现在网页上,或者展示在app上

---进行分析:从数据中 一些规律

3.---url = 请求的协议(http/https) + 网站的域名 + 资源的路径 + 参数

------浏览器请求url地址:

---当前url对应的响应 + js + css + 图片   ---àelements中的内容

------爬虫请求url地址:

         ---当前url对应的响应

------elements的内容和爬虫获取到的url地址的响应不同,爬虫中需要以当前url地址对应的响应为准提取数据

-----当前url地址对应的响应在哪?①从network中找到当前url地址,点击response②右击“显示网页源码”

4.HTTP和HTTPS

--HTTP:超文本传输协议

         -以明文的形式传输

         -效率更高,但不安全

--HTTPS:HTTP + SSL(安全套接子字层)

         -传输之前数据先加密,之后解密获取内容

         -效率较低,但是安全

--HTTP协议之请求

         -1.请求行

         -2.请求头

-User_Agent:用户代理:对方服务器能够通过user_agent知道当前请求对方资源的是什么浏览器

                   - Cookie:用来存储用户信息的,每次请求会被携带上发送给对方的浏览器

                            -要获取登录后才能访问的页面

                            -对方的服务器会通过Cookie来判断我们是一个爬虫

         -3.请求体(get没有,post有)

                   携带数据

--HTTP协议之响应

         -1.响应头

         - Set-Cookie:对方服务器通过该字段设置cookie到本地

         -2.响应体

         -url地址对应的响应

5.get请求和post请求的区别

①get请求无请求体,post有

②get请求把数据放到URL地址中

③post请求change用于登录注册

④post请求携带的数据量比get请求大,多,常用于传输大文本

6.requests模块的学习

1)使用前:pip  install  requests

2)发送get,post请求

         response = requests.get(url)  #发送get请求,请求url地址对应的响应

         response = requests.post(url,data={请求体的字典})  #发送post请求

         response.request.url   #发送请求的url地址(字符串)

         response.url          #response响应的url地址(字符串)

         response.request.headers  # 请求头(字典)

         response.headers        #响应头(字典)

3)response的方法

         -①response.text

         该方式往往会出现乱码,出现乱码使用response.encoding=”utf-8”

         -②response.content.decode()

         把响应的二进制字节流转化为str类型

4)获取网页源码的方法(通过下面三种方式一定可以获取到)

         ①response.content.decode()

         ②response.content.decode(“gbk”)

         ③response.text

5)发送header的请求:为了模拟浏览器,获取和浏览器一模一样的内容

headers = {“”:””,””:””}  #””里面可以在Response Headers里找

例如:

get请求:

import requests

url = 'http://www.baidu.com'

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}

response = requests.get(url, headers=headers)

# print(response)

# 获取网页的html字符串

# response.encoding = 'utf-8'

# print(response.text)

print(response.content.decode())

post请求:

import requests

url = 'https://fanyi.baidu.com/basetrans'

query_string = {'query': '人生苦短,我用python', 'from': 'zh', 'to': 'en'}

headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}

response = requests.post(url, data=query_string, headers=headers)

print(response)

print(response.content.decode())

6)超时参数

requests.get(url,headers=headers,timeout=3) #3秒内必须返回响应,否则会报错

7.retrying模块的学习

pip install retrying

import requests

from retrying import retry

'''专门请求url地址的方法'''

headers = {'User-Agent'

           : 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}

@retry(stop_max_attempt_number=3)  # 让被装饰的函数反复执行三次,三次全部报错才会报错,中间有一次正常,程序继续往后走

def _parse_url(url):

    print('*'*20)

    response = requests.get(url, headers=headers, timeout=5)

    return response.content.decode()

def parse_url(url):

    try:

        html_str = _parse_url(url)

    except:

        html_str = None

    return html_str

if __name__ == '__main__':

    url = 'http://www.baidu.com'

    # print(parse_url(url))

    url1 = 'www.baidu.com'

    print(parse_url(url1))

8.处理cookie相关的请求

-直接携带cookie请求url地址

         1.cookie放在headers中:headers={“User-Agent”:”…..”,”Cookie”:”cookie字符串”}

         2.cookie字典传给cookies参数:requests.get(url,cookies=cookie_dict)

-先发送post请求,获取cookie,带上cookie请求登录后的页面

  -1.session = requests.session()   #session具有的方法和requests一样

  -2.session.post(url,data,headers)  #服务器设置在本地的cookie会保存在session中

  -3.session.get(url)   #会带上之前保存在session中的cookie,能够请求成功

例子:import requests

# 实例化session

session = requests.session()

# 使用session发送post请求,获取对方保存在本地的cookie

post_url = 'http://www.renren.com/PLogin.do'

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}

post_data = {'email': '15076636657', 'password': 'hjr90355'}

session.post(post_url, headers=headers, data=post_data)

# 再使用session请求登录后的页面

url = 'http://www.renren.com/968777388'

response = session.get(url, headers=headers)

with open('renren1.html', 'w', encoding='utf-8') as f:

    f.write(response.content.decode())

2018-11-17

1.数据提取方法

json

数据交换格式,看起来像python类型(列表,字典)的字符串

json.loads(json字符串)    把json字符串转化为python类型

json.dumps(字典)         把python类型转换成json字符串

         json.dumps(ret1, ensure_ascii=False, indent=2)

                   ensure_ascii=False  让中文显示成中文

                   indent=2          让下一行在上一行基础上空2格

2.xpath   一门从html中提取数据的语言(谷歌浏览器有xpath helper插件:帮助我们从elements中定位数据)

1)选择节点(标签)

/html/head/meta    能够选中html下的head下所有的meta标签

2)//                 能够从任意节点开始选择

         //li  :当前页面下所有的li标签

         /html/head//link  :head下的所有的link标签

3)@符号的作用:定位元(选择具体某个元)

         //div[@class='feed-infinite-wrapper']/ul/li  选择class='feed-infinite-wrapper'下的div下的ul下的li

         a/@href  选择a的href的值

4)…. /a/text()   获取文本

 …./a//text() 获取a下的所有文本 //div[@class='indent']/div/table//div[@class='pl2']/a//text()

 

 

3.lxml    使代码可以使用xpath

from lxml import etree

import requests

url = 'https://movie.douban.com/chart'

headers = {'User-Agent'

           : 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'

           }

response = requests.get(url, headers=headers)

html_str = response.content.decode()

# print(html_str)

# 使用etree处理数据

html = etree.HTML(html_str)

# print(html)   # <Element html at 0x4b86f88>

# 1.获取所有的电影的url地址

url_list = html.xpath("//div[@class='indent']//table//div[@class='pl2']/a/@href")

# print(url_list)

# 2.获取所有图片的地址

img_list = html.xpath("//div[@class='indent']//table//a[@class='nbg']/img/@src")

# print(img_list)

# 3.需要把每部电影组成一个字典,字典中是电影的各种数据,比如标题,url,地址图片,评论数,评分

# 思路:1.分组 2.每一组提取数据

ret1 = html.xpath("//div[@class='indent']/div/table")

# print(ret1)   # ret1是Element对象

for table in ret1:

    item = {}

    # item['title'] = table.xpath(".//div[@class='pl2']/a//text()")

    item['title'] = table.xpath(".//div[@class='pl2']/a/text()")[0].replace('/', '').strip()

    item['href'] = table.xpath(".//div[@class='pl2']/a/@href")[0]

    item['img'] = table.xpath(".//a[@class='nbg']/img/@src")[0]

    item['comment_num'] = table.xpath(".//span[@class='pl']/text()")[0]

    item['rating_num'] = table.xpath(".//span[@class='rating_nums']/text()")[0]

    print(item)

4.基础知识点的学习

列表推导式:帮助我们快速生成包含一堆数据的列表

[i+10 for I in range(10)]  à  [10,11,12….19]

[“10月{}日”.format(i) for I in range(1,10)]  à  [“10月1日”,” 10月2日”…” 10月9日”]

         format:字符串格式化的一种方式

         “第{}名”.format(1) 、“第{}名”.format([1,2,3]) 、“第{}名”.format({1,2,3})

字典推导式:帮助我们快速生成包含一堆数据的列表字典

{i+10 : i for I in range(10)}   à  {10:0,11:1….19:9}

{“a{}”.format(i) : 10 for I in range(3)}  à  {“a0”:10,”a1”:10,”a2”:10}

三元运算符

a = 10 if 4>3 else 20  # a=10

5.最后总结

1)url

知道url地址的规律和总页码数:构造url地址的列表

2)发送请求,获取响应:request

3)提取数据

返回json字符串:json模块

返回html字符串:lxml模块配合xpath提取数据

4)保存

 

小项目:

from lxml import etree

import requests

import json

class QiubaiSpider:

    def __init__(self):

        self.url_temp = 'https://www.qiushibaike.com/8hr/page/{}/'

        self.headers = {"User-Agent":

               "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"

           }

    def get_url_list(self):  # 1.根据url地址的规律,构造url_list

        url_list = [self.url_temp.format(i) for i in range(1,14)]

        return url_list

    def parse_url(self, url):

        print("now parseing : ", url)

        response = requests.get(url, headers=self.headers)

        return response.content.decode()

    def get_content_list(self, html_str):

        html = etree.HTML(html_str)

        # 1.分组

        div_list = html.xpath("//div[@id='content-left']/div")

        # print(div_list)

        content_list = []

        for div in div_list:

            item = {}

            item['author_name'] = div.xpath(".//h2/text()")[0].strip() if len(div.xpath(".//h2/text()")) > 0 else None

            item['content'] = div.xpath(".//div[@class='content']/span/text()")

            item['content'] = [i.strip() for i in item['content']]

            item['stats_vote'] = div.xpath(".//span[@class='stats-vote']/i/text()")

            item['stats_vote'] = item['stats_vote'][0] if len(item['stats_vote']) > 0 else None

            item['stats_comments'] = div.xpath(".//span[@class='stats-comments']//i/text()")

            item['stats_comments'] = item['stats_comments'][0] if len(item['stats_comments']) > 0 else None

            item['img'] = div.xpath(".//div[@class='thumb']//img/@src")

            item['img'] = "https:" + item['img'][0] if len(item['img']) > 0 else None

            content_list.append(item)

        return content_list

    def save_content_list(self, content_list):

        with open("qiubai.txt", 'a', encoding='utf-8') as f:

            f.write(json.dumps(content_list, ensure_ascii=False, indent=2))

            f.write('/n')

        print('保存成功')

    def run(self):  # 实现主要逻辑

        # 1.根据url地址的规律,构造url_list

        url_list = self.get_url_list()

        # 2.发送请求,获取响应

        for url in url_list:

            html_str = self.parse_url(url)

            # 3.提取数据

            content_list = self.get_content_list(html_str)

            # 4保存

            self.save_content_list(content_list)

if __name__ == '__main__':

    qiubai = QiubaiSpider()

    qiubai.run()

2018-11-16

1. 爬虫基本操作

   爬虫   - 定向   - 非定向

1. requests

  response = requests.get('http://www.autohome.com.cn/news/')

  response.text

  总结:

response = requests.get('URL')

response.text

response.content

response.encoding

response.apparent_encoding

  response.status_code

  response.cookies.get_dict()

requests.get('http://www.autohome.com.cn/news/',cookie={'xx':'xxx'})

2. beautisoup模块

pip3 install beautifulsoup4

from bs4 import BeautiSoup

soup = BeautiSoup(response.text,features='html.parser')

target = soup.find(id='auto-channel-lazyload-article')

 print(target)

总结:

soup = beautifulsoup('<html>...</html>',features='html.parser')

v1 = soup.find('div')    一个

v1 = soup.find(id='i1')

v1 = soup.find('div',id='i1')

v2 = soup.find_all('div')  多个

v2 = soup.find_all(id='i1')

v2 = soup.find_all('div',id='i1')

obj = v1

obj = v2[0]   可以循环

obj.text

obj.attrs

需求二:通过程序自动登录github

post_dict = {

            "phone": '111111111',

            'password': 'xxx',

            'oneMonth': 1

          }

response = requests.post(

        url="http://dig.chouti.com/login",

        data = post_dict

)

 print(response.text)

 cookie_dict = response.cookies.get_dict()

    c. 模块详细使用(http://www.cnblogs.com/wupeiqi/articles/6283017.html博客有)

        requests

        - 方法关系

            requests.get(.....)

            requests.post(.....)

            requests.put(.....)

            requests.delete(.....)

            requests.request('POST'...)

        - 参数

            request.request

            - method:  提交方式

            - url:     提交地址

            - params:  在URL中传递的参数,GET

                requests.request(

                    method='GET',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'}

                )

                # http://www.oldboyedu.com?k1=v1&k2=v2

            - data:    在请求体里传递的数据

                requests.request(

                    method='POST',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'},

                    data = {'use':'alex','pwd': '123','x':[11,2,3]}

                )

                请求头:

                    content-type: application/url-form-encod.....

                   

                请求体:

                    use=alex&pwd=123

            - json   在请求体里传递的数据

                requests.request(

                    method='POST',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'},

                    json = {'use':'alex','pwd': '123'}

                )

                请求头:

                    content-type: application/json

                   

                请求体:

                    "{'use':'alex','pwd': '123'}"

                PS: 字典中嵌套字典时使用json

            - headers   请求头

                requests.request(

                    method='POST',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'},

                    json = {'use':'alex','pwd': '123'},

                    headers={

                        'Referer': 'http://dig.chouti.com/',

                        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64)

AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

                    }

                )

             - cookies  Cookies

             - files    上传文件

             - auth      基本认知(headers中加入加密的用户名和密码)

             - timeout  请求和响应的超市时间

             - allow_redirects  是否允许重定向

             - proxies  代理

             - verify   是否忽略证书

             - cert      证书文件

             - stream   村长下大片

             - session: 用于保存客户端历史访问信息

 

 

2018-11-18

一、什么是爬虫?爬虫:就是抓取网页数据的程序。

二、爬虫怎么抓取网页数据:

网页三大特征:

-1. 网页都有自己唯一的URL(统一资源定位符)来进行定位

-2. 网页都使用HTML (超文本标记语言)来描述页面信息。

-3. 网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据。

爬虫的设计思路:

-1. 首先确定需要爬取的网页URL地址。

-2. 通过HTTP/HTTP协议来获取对应的HTML页面。

-3. 提取HTML页面里有用的数据:

    a. 如果是需要的数据,就保存起来。

b. 如果是页面里的其他URL,那就继续执行第二步。

三、课程介绍

-2. 如何抓取HTML页面:

HTTP请求的处理,urllib、urllib2、requests处理后的请求可以模拟浏览器发送请求,获取服务器响应的文件

-3. 解析服务器响应的内容

re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery等使用某种描述性一样来给我们需要提取的数据定义一个匹配规则,符合这个规则的数据就会被匹配。

-4. 如何采集动态HTML、验证码的处理

    通用的动态页面采集:Selenium + PhantomJS(无界面):模拟真实浏览器加载js、ajax等非静态页面数据

    Tesseract:机器学习库,机器图像识别系统,可以处理简单的验证码,复杂的验证码可以通过手动输入/专门的打码平台

-5 Scrapy框架:(Scrapy,Pyspider)

    高定制性高性能(异步网络框架twisted),所以数据下载速度非常快,

    提供了数据存储、数据下载、提取规则等组件。

-6 分布式策略 scrapy-reids:

    scrapy-redis,在Scrapy的基础上添加了一套以 Redis 数据库为核心的组件。

        让Scrapy框架支持分布式的功能,主要在Redis里做 请求指纹去重、请求分配、数据临时存储。

-7 爬虫 - 反爬虫 - 反反爬虫 之间的斗争:

    其实爬虫做到最后,最头疼的不是复杂的页面,也是晦涩的数据,而是网站另一边的反爬虫人员。

    User-Agent、代理、验证码、动态数据加载、加密数据。

    数据价值,是否值的去费劲做反爬虫。

    1. 机器成本 + 人力成本 > 数据价值,就不反了,一般做到封IP就结束了。

    2. 面子的战争....

    爬虫和反爬虫之间的斗争,最后一定是爬虫获胜!

为什么?只要是真实用户可以浏览的网页数据,爬虫就一定能爬下来!

四、根据使用场景:分为 通用爬虫  聚焦爬虫

1.通用爬虫:搜索引擎用的爬虫系统。

-1目标:就是尽可能把互联网上所有的网页下载下来,放到本地服务器里形成备份,

        再对这些网页做相关处理(提取关键字、去掉广告),最后提供一个用户检索接口。

-2抓取流程:

    a) 首选选取一部分已有的URL,把这些URL放到待爬取队列。

    b) 从队列里取出这些URL,然后解析DNS得到主机IP,然后去这个IP对应的服务器里下载HTML页面,保存到搜索引擎的本地服务器。

        之后把这个爬过的URL放入已爬取队列。

    c) 分析这些网页内容,找出网页里其他的URL连接,继续执行第二步,直到爬取条件结束。

-3 搜索引擎如何获取一个新网站的URL:

    1. 主动向搜索引擎提交网址:http://zhanzhang.baidu.com/linksubmit/url

    2. 在其他网站里设置网站的外链。

    3. 搜索引擎会和DNS服务商进行合作,可以快速收录新的网站。

    DNS:就是把域名解析成IP的一种技术。

-4 通用爬虫并不是万物皆可爬,它也需要遵守规则:

Robots协议:协议会指明通用爬虫可以爬取网页的权限。

Robots.txt 只是一个建议。并不是所有爬虫都遵守,一般只有大型的搜索引擎爬虫才会遵守。

    咱们个人写的爬虫,就不管了。

 

 

-5 通用爬虫工作流程:爬取网页 - 存储数据 - 内容处理 - 提供检索/排名服务

-6 搜索引擎排名:

    1. PageRank值:根据网站的流量(点击量/浏览量/人气)统计,流量越高,网站也越值钱,排名越靠前。

    2. 竞价排名:谁给钱多,谁排名就高。

-7 通用爬虫的缺点:

    1. 只能提供和文本相关的内容(HTML、Word、PDF)等等,但是不能提供多媒体文件(音乐、图片、视频)和二进制文件(程序、脚本)等等。

    2. 提供的结果千篇一律,不能针对不同背景领域的人提供不同的搜索结果。

    3. 不能理解人类语义上的检索。

为了解决这个问题,聚焦爬虫出现了:

聚焦爬虫:爬虫程序员写的针对某种内容的爬虫。

面向主题爬虫,面向需求爬虫:会针对某种特定的内容去爬取信息,而且会保证信息和需求尽可能相关。

2018-11-19

1. 浏览器发送HTTP请求的过程:

1)当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。

2)当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。

3)浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。

4)当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。

2. HTTP请求主要分为Get和Post两种方法

GET是从服务器上获取数据,POST是向服务器传送数据

GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese

POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码,

注意:避免使用Get方式提交表单,因为有可能会导致安全问题。 比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。

3. 常见状态码:

100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。

200~299:表示服务器成功接收请求并已完成整个处理过程。常用200(OK 请求成功)。

300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。

400~499:客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服务器拒绝访问,权限不够)。

500~599:服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)。

4. Cookie 和 Session:

服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。

为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。

Cookie:通过在 客户端 记录的信息确定用户的身份

Session:通过在 服务器端 记录的信息确定用户的身份

2018-12-2

  1. Scrapy架构图

 

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

2. 制作 Scrapy 爬虫 一共需要4步:

新建项目 (scrapy startproject xxx):新建一个新的爬虫项目

明确目标 (编写items.py):明确你想要抓取的目标

制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页

存储内容 (pipelines.py):设计管道存储爬取内容

3.项目中的各文件的作用(以:项目名mySpider为例)

scrapy.cfg :项目的配置文件

 

mySpider/ :项目的Python模块,将会从这里引用代码

mySpider/__init__.py:这个必须有,虽然文件里没有内容

mySpider/items.py :项目的目标文件(存储数据的)

mySpider/pipelines.py :项目的管道文件

mySpider/settings.py :项目的设置文件

mySpider/spiders/ :存储爬虫代码目录

 

 

Python自带的模块:/usr/lib/python2.7/urllib2.py

Python的第三方模块: /usr/local/lib/python2.7/site-packages

urllib2 默认的 User-Agent:Python-urllib/2.7

User-Agent: 是爬虫和反爬虫斗争的第一步,养成好习惯,发送请求带User-Agent

response 是服务器响应的类文件,除了支持文件操作的方法外,还支持以下常用的方法:

# 返回 HTTP的响应码,成功返回200,4服务器页面出错,5服务器问题

print response.getcode()

# 返回 返回实际数据的实际URL,防止重定向问题

print response.geturl()

# 返回 服务器响应的HTTP报头

print response.info()

User-Agent 历史:

Mosaic 世界上第一个浏览器:美国国家计算机应用中心

Netscape 网景:Netscape(支持框架),慢慢开始流行....(第一款支持框架的浏览器)

Microsoft 微软:Internet Explorer(也支持框架)

第一次浏览器大战:网景公司失败..消失

Mozilla 基金组织:Firefox 火狐 - (Gecko内核)(第一款浏览器内核)

User-Agent 决定用户的浏览器,为了获取更好的HTML页面效果。

IE开了个好头,大家都开就给自己披着了个 Mozilla 的外皮

Microsoft公司:IE(Trident)

Opera公司:Opera(Presto)

Mozilla基金会:Firefox(Gecko)

Linux组织:KHTML (like Gecko)

Apple公司:Webkit(like KHTML)

Google公司:Chrome(like webkit)

其他浏览器都是IE/Chrome内核

urllib 的 urlencode() 接收的参数是一个字典:

wd = {"wd" : "传智播客"}

urllib.urlencode(wd)

结果:wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2

 

 

Get 和 Post请求的区别:

Get : 请求的url会附带查询参数,

POST:请求的url不带参数

对于Get请求:查询参数在QueryString里保存

对于Post请求:查询参数在Form表单里保存

做爬虫最需要关注的不是页面信息,而是页面信息的数据来源。

AJAX 方式加载的页面,数据来源一定是JSON

拿到JSON,就是拿到了网页的数据

 

posted @ 2019-03-01 08:53  Miss-Gao  阅读(589)  评论(0编辑  收藏  举报