Spider_权威指南_seeion&cookies_爬虫基本模板(3个类)

# session 与 cookie

# 可能大家对session已经比较熟悉了,也大概了解了session的机制和原理,但是我们在做爬虫时如何会运用到session呢,就是接下来要讲到的会话保持。
# 首先说一下,为什么要进行会话保持的操作?
# requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该
# 网站的其他网页都会默认使用该session之前使用的cookie等参数尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,
# 有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以
# 只登陆一次,然后保持这种状态去做其他的或者更多的请求。其次,我们该如何使用会话保持?举一个事例来说明一下:

#requests.session():维持会话,可以让我们在跨请求时保存某些参数
 
import requests
 
#实例化session
session = requests.session()
url = 'https://www.douban.com/accounts/login'
form_data = {
    'source': 'index_nav',
    'form_email': 'xxx',
    'form_password': 'xxx',
    'captcha-solution': 'stamp',
    'captcha-id': 'b3dssX515MsmNaklBX8uh5Ab:en'}
#设置请求头
req_header = {
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
 
#使用session发起请求
response = session.post(url,headers=req_header,data=form_data)
if response.status_code == 200:
    #访问个人主页:
    url = 'https://www.douban.com/people/175417123/'
    response = session.get(url,headers = req_header)
    if response.status_code == 200:
        with open('douban3.html','w') as file:
            file.write(response.text)

            

import requests
import time
mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }
x = requests.session()
requests.utils.add_dict_to_cookiejar(x.cookies,{"PHPSESSID":"07et4ol1g7ttb0bnjmbiqjhp43"})
x.get("http://127.0.0.1:80",cookies = mycookie)
time.sleep(5)
#请求以后抓包可以检验一下是不是添加成功
x.get("http://127.0.0.1:80")

# 这样,通过requests.utils.add_dict_to_cookiejar对session对象设置cookie,之后所有的请求都会自动加上我自定义的cookie内容。
# 也可以通过requests.utils.cookiejar_from_dict 先生成一个cookiejar对象,到时候再赋值给session.cookies。
# 貌似还可以使用session.cookies.set()或者update()。

# 另外说一点单独处理cookie字段,处理为字典格式:
cookie = "SINAGLOBAL=821034395211.0111.1522571861723; wb_cmtLike_1850586643=1; [email protected]; wb_timefeed_1850586643=1; UOR=,,login.sina.com.cn; wvr=6; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWsNeq71O_sXkkXNnXFHgOW5JpX5KMhUgL.Fo2RSK5f1hqcShe2dJLoI0qLxK-L12qLB-zLxKqL1hnL1K2LxK-LBo5L12qLxKqL1hML1KzLxKnL1K.LB-zLxK-L1K-LBKqt; YF-V5-G0=c99031715427fe982b79bf287ae448f6; ALF=1556795806; SSOLoginState=1525259808; SCF=AqTMLFzIuDI5ZEtJyAEXb31pv1hhUdGUCp2GoKYvOW0LQTInAItM-ENbxHRAnnRUIq_MR9afV8hMc7c-yVn2jI0.; SUB=_2A2537e5wDeRhGedG7lIU-CjKzz-IHXVUm1i4rDV8PUNbmtBeLVrskW9NUT1fPIUQGDKLrepaNzTEZxZHOstjoLOu; SUHB=0IIUWsCH8go6vb; _s_tentry=-; Apache=921830614666.5322.1525261512883; ULV=1525261512916:139:10:27:921830614666.5322.1525261512883:1525239937212; YF-Page-G0=b5853766541bcc934acef7f6116c26d1"
cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")}
 

    
    
    
# 实例:    
import requests
from bs4 import BeautifulSoup


def getPage(url):
    """
    Utilty function used to get a Beautiful Soup object from a given URL
    """

    session = requests.Session()   # requests.session():维持会话,可以让我们在跨请求时保存某些参数

    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
    try:
        req = session.get(url, headers=headers)
    except requests.exceptions.RequestException:
        return None
    bs = BeautifulSoup(req.text, 'html.parser')
    return bs

# 第四章内容--处理不同的网站布局:
# 我们想在功能类似的网站上抓取类似内容时,往往这些网站的内容可能布局不一样(相同内容的标签可能不同),由于通常我们爬取的网站数量有限,
# 我们没有必要去开发比较一套统一的复杂的的算法或机器学习来识别页面上的哪些文字看起来像标题或段落,只需要手动的去检查网页元素,分别对
# 不同的网站采用不同的方式去爬取就好了:


# 示例 1:书上的例子,不没法跑通。
import requests

class Content:
    def __init__(self, url, title, body):
        self.url = url
        self.title = title
        self.body = body


def getPage(url):
    req = requests.get(url)
    return BeautifulSoup(req.text, 'html.parser')


def scrapeNYTimes(url):
    bs = getPage(url)
    title = bs.find('h1').text
    lines = bs.select('div.StoryBodyCompanionColumn div p')  # nytime独有的布局
    body = '\n'.join([line.text for line in lines])
    return Content(url, title, body)

def scrapeBrookings(url):
    bs = getPage(url)
    title = bs.find('h1').text
    body = bs.find('div', {'class', 'post-body'}).text       # brookings独有的布局
    return Content(url, title, body)


url = 'https://www.brookings.edu/blog/future-development/2018/01/26/delivering-inclusive-urban-access-3-uncomfortable-truths/'
content = scrapeBrookings(url)
print('Title: {}'.format(content.title))  
print('URL: {}\n'.format(content.url))
print(content.body)

url = 'https://www.nytimes.com/2018/01/25/opinion/sunday/silicon-valley-immortality.html'
content = scrapeNYTimes(url)
print('Title: {}'.format(content.title))
print('URL: {}\n'.format(content.url))
print(content.body)

# 示例 2: 修改的示例 1
import requests
from bs4 import BeautifulSoup

class Content:
    def __init__(self, url, title, body):
        self.url = url
        self.title = title
        self.body = body


def getPage(url):
    html = requests.get(url)
    return BeautifulSoup(html.content,'html.parser')  # 注,此处使用 html.text时将会导致乱码

def scrapeGushidaquan(url):
    bs = getPage(url)
    title = bs.find('h2').text
    body = bs.find('div', {'class', 'tsrtInfo'}).text                              # Gushidaquan独有的布局
    return Content(url, title, body)

def scrapeRensheng5(url):
    bs = getPage(url)
    title = bs.find('h1').text
    body = bs.find_all('p')[0].text # 段落    NavigableString对象.text为 string     # Rensheng5独有的布局
    return Content(url, title, body)



url = 'https://www.gushidaquan.cc/'
content = scrapeGushidaquan(url)
print('Title: {}'.format(content.title))  
print('URL: {}\n'.format(content.url))
print(content.body)

print("-"*15)

url = 'http://www.rensheng5.com/zx/onduzhe/'
content = scrapeRensheng5(url)
print('Title: {}'.format(content.title))
print('URL: {}\n'.format(content.url))
print(content.body)

Title: 故事大全
URL: https://www.gushidaquan.cc/

   小三,是通过互联网流行起来的一个词,是对第三者的蔑称。是爱情小说及家庭伦理故事恒久的元素,也是当前不可否认的社会现象。在民间还有狐狸精、邪花等贬称。
今天故事大全小编给您推荐几篇关于小三的精彩故事。有的故事比较长,建议您边看边收藏哦。... 
---------------
Title: 读者在线阅读
URL: http://www.rensheng5.com/zx/onduzhe/

  《读者》是甘肃人民出版社主办的一份综合类文摘杂志,原名《读者文摘》。  《读者》杂志多年以来始终以弘扬人类优秀文化为己任,坚持“博采中外、荟萃精华、启迪思想、开阔眼界”的办刊宗旨,赢得了各个年龄段和不同阶层读者的喜爱与拥护。  《读者》被誉为“中国人的心灵读本”、“中国期刊第一品牌”。  >>> 读者文摘在线阅读---欢迎您。
# 我们还是有办法来处理针对不同网页布局的爬取的,即把 各网站的不同点:name,url,css选择器等信息作为参数传递给
# bs.find()或 bs.find_all()的 tag/tag_list,attribues_dict参数 ,或传递给 bs.select() 来定义网站的结构及目标数据的位置。


# 总结:
# 3个类:
# content--用来存储所获取的数据的相关信息
# Website--用类来存储目标数据所在网页的 name,url,titleTag,structure等信息   
# Crawler--用来爬取数据:获取 bs,解析bs 获取 title,body对象,存储数据信息到 content对象。


# 有一点不明白: url为什么单独给,而不使用 website对象里的 url?


class Content:
    """
    用来存储所获取的数据的相关信息
    """
    def __init__(self, url, title, body):
        self.url = url
        self.title = title
        self.body = body

    def print(self):  # 将 打印或数据持久化的工作封装到函数里。
        """
        Flexible printing function controls output
        """
        print('URL: {}'.format(self.url))
        print('TITLE: {}'.format(self.title))
        print('BODY:\n{}'.format(self.body))

 
    
class Website:
    """ 
    用类来存储目标数据所在网页的 name,url,titleTag,structure等信息   
    """
    def __init__(self, name, url, titleTag, bodyTag):
        self.name = name
        self.url = url
        self.titleTag = titleTag
        self.bodyTag = bodyTag


        
import requests
from bs4 import BeautifulSoup


class Crawler:
    # 获取 bs
    def getPage(self, url):
        try:
            html = requests.get(url)
        except requests.exceptions.RequestException:
            return None
#         return BeautifulSoup(html.text, 'html.parser')
        return BeautifulSoup(html.content, 'html.parser')
    
    # 解析 bs获取 tag对象
    def safeGet(self, pageObj, selector):
        """
        Utilty function used to get a content string from a Beautiful Soup object and a selector. 
        Returns an empty string if no objectis found for the given selector
        """
        selectedElems = pageObj.select(selector)
        if selectedElems is not None and len(selectedElems) > 0:
            return '\n'.join([elem.get_text() for elem in selectedElems])
        return ''
    
    #  调用上面两个方法,并将获得的 tag对象 实例化存储到 Content对象里。
    def parse(self, site_obj, url):
        """
        调用 getPage()获取包含目标数据的 bs对象,使用 safeGet()解析 bs对象的 title和 body,非空时存储到 content里
        """
        bs = self.getPage(url)
        if bs is not None:
            title = self.safeGet(bs, site_obj.titleTag)
            body = self.safeGet(bs, site_obj.bodyTag)
            if title != '' and body != '':
                content = Content(url, title, body)
                content.print()  # 调用封装后的 print()

                
if __name__=='__main__': 
#     # 将要爬取的目标网页的 name,url,tag,cssselector等信息存储在嵌套列表里:
#     siteData = [
#         ['O\'Reilly Media', 'http://oreilly.com', 'h1', 'section#product-description'],
#         ['Reuters', 'http://reuters.com', 'h1', 'div.StandardArticleBody_body_1gnLA'],
#         ['Brookings', 'http://www.brookings.edu', 'h1', 'div.post-body'],
#         ['New York Times', 'http://nytimes.com', 'h1', 'div.StoryBodyCompanionColumn div p']
#     ]
#     # 将上述信息实例化成 website对象:
#     websites = []
#     for site in siteData:
#         site_obj=Website(site[0], site[1], site[2], site[3])
#         websites.append(site_obj)

#     crawler = Crawler()
#     crawler.parse(websites[0], 'http://shop.oreilly.com/product/0636920028154.do')
#     crawler.parse(websites[1], 'http://www.reuters.com/article/us-usa-epa-pruitt-idUSKBN19W2D0')
#     crawler.parse(websites[2], 'https://www.brookings.edu/blog/techtank/2016/03/01/idea-to-retire-old-methods-of-policy-education/')
#     crawler.parse(websites[3], 'https://www.nytimes.com/2018/01/28/business/energy-environment/oil-boom.html')

    # 将要爬取的目标网页的 name,url,tag,cssselector等信息存储在嵌套列表里:
    siteData = [
        ['故事大全', 'http://www.brookings.edu', 'h2', 'div.bigtit'],
        ['人生故事', 'http://nytimes.com', 'p', 'div.zzinfo']
    ]
    # 将上述信息实例化成 website对象:
    websites = []
    for site in siteData:
        site_obj=Website(site[0], site[1], site[2], site[3])
        websites.append(site_obj)

    crawler = Crawler()
    crawler.parse(websites[0], 'https://www.gushidaquan.cc/')
    crawler.parse(websites[1], 'http://www.rensheng5.com/zx/onduzhe/')
URL: https://www.gushidaquan.cc/
TITLE: 故事大全
每日
故事
爱情故事
鬼故事
故事会
奇谈怪事
民间故事
幽默故事
传奇故事
哲理故事
人生故事
范文
情话大全
健康资讯
BODY:

故事大全
上网看故事,首选故事大全,阅读量排名第一的故事网站!

URL: http://www.rensheng5.com/zx/onduzhe/
TITLE:   《读者》是甘肃人民出版社主办的一份综合类文摘杂志,原名《读者文摘》。  《读者》杂志多年以来始终以弘扬人类优秀文化为己任,坚持“博采中外、荟萃精华、启迪思想、开阔眼界”的办刊宗旨,赢得了各个年龄段和不同阶层读者的喜爱与拥护。  《读者》被誉为“中国人的心灵读本”、“中国期刊第一品牌”。  >>> 读者文摘在线阅读---欢迎您。

读者在线阅读_读者文摘在线阅读
Copyright © 人生屋 版权所有


BODY:

读者在线阅读
  《读者》是甘肃人民出版社主办的一份综合类文摘杂志,原名《读者文摘》。  《读者》杂志多年以来始终以弘扬人类优秀文化为己任,坚持“博采中外、荟萃精华、启迪思想、开阔眼界”的办刊宗旨,赢得了各个年龄段和不同阶层读者的喜爱与拥护。  《读者》被誉为“中国人的心灵读本”、“中国期刊第一品牌”。  >>> 读者文摘在线阅读---欢迎您。
[人生]

声名20-06-24
有原则的人生最幸福20-06-23
父亲的墨水20-06-22
与母亲相守50天20-06-22
你不是世界的中心20-06-22
海上的父亲20-06-22

[人物]

三老道喜图20-06-22
俯首甘为孺子牛20-06-22
靛蓝商人20-06-22
塬下写作20-06-22
我的小说有辣子和葱20-06-21
见客记20-06-20

[文苑]

海明威的红笔20-06-22
温柔的讲述者20-06-22
我在等你啊20-06-22
春天等不来20-06-21
生有时,寐有时20-06-21
我的目光清澈20-06-20

[社会]

经济学何为20-06-24
给跳蚤穿靴子20-06-24
科技智人20-06-24
常态化偏见20-06-24
相见恨晚20-06-24
帮助别人才是文明的起点20-06-24

[生活]

我的命运是一座花园20-06-24
夜航船20-06-22
当特色菜遇上口味菜20-06-22
为什么看过的电纸书容易忘20-06-22
三泡茶20-06-22
被疫情改变的习惯20-06-22

[文明]

宋画里的医者日常20-06-22
饭不厌诈20-06-22
孤独的52赫兹20-06-20
用人之策20-06-20
“卫生”之起源20-05-22
绘画中的食物20-05-22

[点滴]

蛇与仙鹤20-06-24
真痴20-06-24
山的意义20-06-24
欲望20-06-21
傻气与福气20-06-21
鞋子20-06-21

你可能感兴趣的:(Spider_权威指南_seeion&cookies_爬虫基本模板(3个类))