爬虫基础-2

寻找登录的post地址
  - 在form表单中寻找action对应的url地址
  - post的数据是input标签中name的值作为键,真正的用户名密码作为值的字典,post的url地址就是action对应的url地址

  - 抓包,寻找登录的url地址
  - 勾选perserve log按钮,防止页面跳转找不到url
  - 寻找post数据,确定参数
  - 参数不会变,直接用,比如密码不是动态加密的时候
  - 参数会变
  - 参数在当前的响应中
  - 通过js生成

定位想要的js
  - 选择会触发js时间的按钮,点击event listener,找到js的位置
  - 通过chrome中的search all file来搜索url中关键字
  - 添加断点的方式来查看js的操作,通过python来进行同样的操作

安装第三方模块
  - pip install retrying
  - 下载源码解码,进入解压后的目录,```python setup.py install```
  - `***.whl` 安装方法 `pip install ***.whl`

json使用注意点
  - json中的字符串都是双引号引起来的
  - 如果不是双引号
  - eval:能实现简单的字符串和python类型的转化
  - replace:把单引号替换为双引号
  - 往一个文件中写入多个json串,不再是一个json串,不能直接读取
  - 一行写一个json串,按照行来读取

# coding=utf-8
import requests
import json
import sys

class BaiduFanyi:
    def __init__(self,trans_str):
        self.trans_str = trans_str
        self.lang_detect_url = "http://fanyi.baidu.com/langdetect"
        self.trans_url = "http://fanyi.baidu.com/basetrans"
        self.headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36"}

    def parse_url(self,url,data): #发送post请求,获取响应
        response = requests.post(url,data=data,headers=self.headers)
        return json.loads(response.content.decode())

    def get_ret(self,dict_response):#提取翻译的结果
        ret = dict_response["trans"][0]["dst"]
        print("result is :",ret)

    def run(self):#实现主要逻辑
        #1.获取语言类型
            #1.1 准备post的url地址,post_data
        lang_detect_data = {"query":self.trans_str}
            #1.2 发送post请求,获取响应
        lang = self.parse_url(self.lang_detect_url,lang_detect_data)["lan"]
            #1.3 提取语言类型
        #2.准备post的数据
        trans_data = {"query":self.trans_str,"from":"zh","to":"en"} if lang== "zh" else             {"query":self.trans_str,"from":"en","to":"zh"}
        #3.发送请求,获取响应
        dict_response = self.parse_url(self.trans_url,trans_data)
        #4.提取翻译的结果
        self.get_ret(dict_response)

if __name__ == ‘__main__‘:
    trans_str= sys.argv[1]
    baidu_fanyi = BaiduFanyi(trans_str)
    baidu_fanyi.run()

# coding=utf-8
import json
import requests
from parse_url import parse_url
from pprint import pprint

url = "https://m.douban.com/rexxar/api/v2/subject_collection/movie_showing/items?start=0&count=18&loc_id=108288"
html_str = parse_url(url)

# json.loads把json字符串转化为python类型
ret1 = json.loads(html_str)
# pprint(ret1)
# print(type(ret1))

# json.dumps能够把python类型转化为json字符串
with open("douban.json","w",encoding="utf-8") as f:
    f.write(json.dumps(ret1,ensure_ascii=False,indent=4))
    # f.write(str(ret1))

# with open("douban.json","r",encoding="utf-8") as f:
#     ret2 = f.read()
#     ret3 = json.loads(ret2)
#     print(ret3)
#     print(type(ret3))

# 使用json。load提取类文件对象中的数据
with open("douban.json","r",encoding="utf-8") as f:
    ret4 = json.load(f)
    print(ret4)
    print(type(ret4))

#json.dump能够把python类型放入类文件对象中
with open("douban1.json","w",encoding="utf-8") as f:
    json.dump(ret1,f,ensure_ascii=False,indent=2)

# coding=utf-8
import re
from parse_url import parse_url
import json

url = "http://36kr.com/"
html_str = parse_url(url)

ret = re.findall("<script>var props=(.*?),locationnal=",html_str)[0]

with open("36kr.json","w",encoding="utf-8") as f:
    f.write(ret)

ret = json.loads(ret)
print(ret)

import requests,sys,json

class Automatic():
    def __init__(self,translade_word):
        self.translade_word = translade_word
        self.langdetect_headers ={"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36"}
        self.langdetect_parpams = {"query": translade_word}
        self.langdetect_url ="http://fanyi.baidu.com/langdetect"
        self.translated_url = "http://fanyi.baidu.com/basetrans"

    def langdetect(self):
        response = requests.post(self.langdetect_url,headers = self.langdetect_headers,data=self.langdetect_parpams)
        return json.loads(response.content.decode())[‘lan‘]

    def get_data_language(self,language_word):
        #
        # if "zh" ==language_word:
        #     translade_data ={"query":self.translade_word,
        #                         "from":"zh",
        #                         "to":"en"}
        # else:
        #     translade_data = {"query": self.translade_word,
        #                       "from": language_word,
        #                       "to": "zh"}
        return {"query":self.translade_word,"from":"zh","to":"en"} if "zh" ==language_word                 else {"query": self.translade_word,"from": language_word,"to": "zh"}

    def translade(self,translade_data):
        response = requests.post(self.translated_url,data=translade_data,headers = self.langdetect_headers)
        response_data = json.loads(response.text)
        # print("1111111111",response_data)
        return response_data

    def get_ret(self,response_data):
        data = response_data["trans"][0]["dst"]
        print("{}  翻译后的结果:{}".format(self.translade_word, data))

    def run(self):
        language_word = self.langdetect()
        translade_data= self.get_data_language(language_word)
        response_data = self.translade(translade_data)
        self.get_ret(response_data)

if __name__ == ‘__main__‘:
    translade_word = sys.argv[1]
    automatic = Automatic(translade_word)
    automatic.run()

# coding=utf-8
import requests
from retrying import retry

headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}

@retry(stop_max_attempt_number=3)
def _parse_url(url,method,data,proxies):
    print("*"*20)
    if method=="POST":
        response = requests.post(url,data=data,headers=headers,proxies=proxies)
    else:
        response = requests.get(url,headers=headers,timeout=3,proxies=proxies)
    assert  response.status_code == 200
    return response.content.decode()

def parse_url(url,method="GET",data=None,proxies={}):
    try:
        html_str = _parse_url(url,method,data,proxies)
    except:
        html_str = None

    return html_str

if __name__ == ‘__main__‘:
    url = "www.baidu.com"
    print(parse_url(url))

正则使用的注意点
  - `re.findall("a(.*?)b","str")`,能够返回括号中的内容,括号前后的内容起到定位和过滤的效果

  - 原始字符串r,待匹配字符串中有反斜杠的时候,使用r能够忽视反斜杠带来的转义的效果

  - 点号默认情况匹配不到`\n`

  - `\s`能够匹配空白字符,不仅仅包含空格,还有`\t|\r\n`

xpath学习重点
  - 使用xpath helper或者是chrome中的copy xpath都是从element中提取的数据,但是爬虫获取的是url对应的响应,往往和elements不一样
  - 获取文本
  - `a/text()` 获取a下的文本
  - `a//text()` 获取a下的所有标签的文本
  - `//a[text()=‘下一页‘]` 选择文本为下一页三个字的a标签

  - `@符号`
  - `a/@href`
  - `//ul[@id="detail-list"]`

  - `//`
  - 在xpath最前面表示从当前html中任意位置开始选择
  - `li//a` 表示的是li下任何一个标签

lxml使用注意点
  - lxml能够修正HTML代码,但是可能会改错了
  - 使用etree.tostring观察修改之后的html的样子,根据修改之后的html字符串写xpath

  - lxml 能够接受bytes和str的字符串

  - 提取页面数据的思路
  - 先分组,渠道一个包含分组标签的列表
  - 遍历,取其中每一组进行数据的提取,不会造成数据的对应错乱

# coding=utf-8
import requests
import json

class DoubanSpider:
    def __init__(self):
        self.url_temp_list = [
            {
                "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?start={}&count=18&loc_id=108288",
                "country": "US"
            },
            {
                "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_english_hot/items?start={}&count=18&loc_id=108288",
                "country": "UK"
            },
            {
                "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_domestic_hot/items?start={}&count=18&loc_id=108288",
                "country": "CN"
            }
        ]
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36"}

    def parse_url(self, url):  # 发送请求,获取响应
        print(url)
        response = requests.get(url, headers=self.headers)
        return response.content.decode()

    def get_content_list(self, json_str):  # 提取是数据
        dict_ret = json.loads(json_str)
        content_list = dict_ret["subject_collection_items"]
        total = dict_ret["total"]
        return content_list, total

    def save_content_list(self, content_list,country):  # 保存
        with open("douban.txt", "a", encoding="utf-8") as f:
            for content in content_list:
                content["country"] = country
                f.write(json.dumps(content, ensure_ascii=False))
                f.write("\n")  # 写入换行符,进行换行
        print("保存成功")

    def run(self):  # 实现主要逻辑
        for url_temp in self.url_temp_list:
            num = 0
            total = 100  # 假设有第一页
            while num < total + 18:
                # 1.start_url
                url = url_temp["url_temp"].format(num)
                # 2.发送请求,获取响应
                json_str = self.parse_url(url)
                # 3.提取是数据
                content_list, total = self.get_content_list(json_str)

                # 4.保存
                self.save_content_list(content_list,url_temp["country"])
                # if len(content_list)<18:
                #     break
                # 5.构造下一页的url地址,进入循环
                num += 18

if __name__ == ‘__main__‘:
    douban_spider = DoubanSpider()
    douban_spider.run()

# coding=utf-8
import requests
import re
import json

class Neihan:
    def __init__(self):
        self.start_url = "http://neihanshequ.com/"
        self.next_url_temp = "http://neihanshequ.com/joke/?is_json=1&app_name=neihanshequ_web&max_time={}"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}

    def parse_url(self, url):  # 发送请求
        print(url)
        response = requests.get(url, headers=self.headers)
        return response.content.decode()

    def get_first_page_content_list(self, html_str):  # 提取第一页的数据
        content_list = re.findall(r"<h1 class=\"title\">.*?<p>(.*?)</p>", html_str, re.S)
        max_time = re.findall("max_time: ‘(.*?)‘,", html_str)[0]
        return content_list, max_time

    def save_content_list(self, content_list):  # 保存
        with open("neihan.txt", "a", encoding="utf-8") as f:
            for content in content_list:
                f.write(json.dumps(content, ensure_ascii=False))
                f.write("\n")
        print("保存成功")

    def get_content_list(self, json_str):  # 提取从第二页开始的json中的数据
        dict_ret = json.loads(json_str)
        data = dict_ret["data"]["data"]
        content_list = [i["group"]["content"] for i in data]
        max_time = dict_ret["data"]["max_time"]
        has_more = dict_ret["data"]["has_more"]
        return content_list, max_time, has_more

    def run(self):  # 实现主要逻辑
        # 1.start_url
        # 2.发送请求,获取响应
        html_str = self.parse_url(self.start_url)
        # 3.提取数据
        content_lsit, max_time = self.get_first_page_content_list(html_str)
        # 4.保存
        self.save_content_list(content_lsit)
        has_more = True  # 有第二页
        while has_more:  # 内涵社区是用has_more 来判断是否有下一页的
            # 5.构造下一页的url地址
            next_url = self.next_url_temp.format(max_time)
            # 6.发送请求,获取响应
            json_str = self.parse_url(next_url)
            # 7.提取数据,提取max_time
            content_lsit, max_time, has_more = self.get_content_list(json_str)
            # 8.保存
            self.save_content_list(content_lsit)
            # 9.循环5-8步

if __name__ == ‘__main__‘:
    neihan = Neihan()
    neihan.run()

# coding=utf-8
from lxml import etree

text = ‘‘‘ <div> <ul>
        <li class="item-1"><a>first item</a></li>
        <li class="item-1"><a href="link2.html">second item</a></li>
        <li class="item-inactive"><a href="link3.html">third item</a></li>
        <li class="item-1"><a href="link4.html">fourth item</a></li>
        <li class="item-0"><a href="link5.html">fifth item</a>
        </ul> </div> ‘‘‘

html = etree.HTML(text)
print(html)
#查看element对象中包含的字符串
# print(etree.tostring(html).decode())

#获取class为item-1 li下的a的herf
ret1 = html.xpath("//li[@class=‘item-1‘]/a/@href")
print(ret1)

#获取class为item-1 li下的a的文本
ret2 = html.xpath("//li[@class=‘item-1‘]/a/text()")
print(ret2)

#每个li是一条新闻,把url和文本组成字典
for href in ret1:
    item = {}
    item["href"] = href
    item["title"] = ret2[ret1.index(href)]
    print(item)

print("*"*100)
#分组,根据li标签进行分组,对每一组继续写xpath
ret3 = html.xpath("//li[@class=‘item-1‘]")
print(ret3)
for i in ret3:
    item=  {}
    item["title"] = i.xpath("a/text()")[0] if len(i.xpath("./a/text()"))>0 else None
    item["href"] = i.xpath("./a/@href")[0] if len( i.xpath("./a/@href"))>0 else None
    print(item)

#  _*_coding: utf-8 _*_
import json
import requests
from parse_url import parse_url
import sys
from pprint import pprint
import re

class douban:
    def __init__(self, url):
        self.url = url
        self.L_url = []
        self.start = 0
        self.html_str = ""
        self.ret = {}

    def get_total(self):
        html_str = parse_url(self.url)
        # json.loads把json字符串转化为python类型
        ret1 = json.loads(html_str)
        total = ret1["total"]
        return total

    def get_url(self, total):
        while self.start < total + 50:
            url = self.url.format(
                self.start + 1, 50)
            self.L_url.append(url)
            self.start += 50

    def get_name(self):
        Wurl = self.url
        reg = r‘https://m.douban.com/rexxar/api/v2/subject_collection/(.*?)/‘
        name = re.findall(reg, Wurl)
        return name[0] + ".json"

    def data(self, name):
        for url in self.L_url:
            self.html_str = parse_url(url)
            ret = json.loads(self.html_str)
            with open(name, "a", encoding="utf-8") as f:
                f.write(json.dumps(ret, ensure_ascii=False, indent=4))

    def run(self):
        total = self.get_total()
        self.get_url(total=total)
        name = self.get_name()
        self.data(name=name)

if __name__ == ‘__main__‘:
    url_dict = {
        "美国": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?os=android&start=0&count=18&loc_id=108288",
        "英国": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_english_hot/items?os=android&start=0&count=18&loc_id=108288",
        "韩国": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_korean_drama_hot/items?os=android&start=0&count=18&loc_id=108288",
        "中国": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_domestic_hot/items?os=android&start=0&count=18&loc_id=108288"
    }
    Len = len(sys.argv)
    for i in range(Len - 1):
        url_name = sys.argv[i + 1]
        url = url_dict[url_name]
        print(url)
        douban = douban(url)
        douban.run()

原文地址:https://www.cnblogs.com/MR-allen/p/10584063.html

时间: 2024-10-31 22:33:50

爬虫基础-2的相关文章

转 Python爬虫入门二之爬虫基础了解

静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以及百度搜索框,这个过程其实就是用户输入网址之后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器 HTML.JS.CSS 等文件,浏览器解析出来,用户便可以看到形形色色的图片了. 因此,用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容

python学习八十四天:爬虫基础

爬虫基础 爬虫相关概念简介 什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫 1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆卖瓜的意思),但是php在实现爬虫中支持多线程和多进程方面做的不好. 2.java:可以实现爬虫.java可以非常好的处理和实现爬虫,是唯一可以与python并驾齐驱且是python的头号劲敌.但是java实现爬虫代码较为臃肿,重构成本较大. 3.c.c++:可以实现爬虫.但是

python爬虫-基础入门-爬取整个网站《3》

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

爬虫基础以及一个简单的实例

最近在看爬虫方面的知识,看到崔庆才所著的<Python3网络爬虫开发实战>一书讲的比较系统,果断入手学习.下面根据书中的内容,简单总结一下爬虫的基础知识,并且实际练习一下.详细内容请见:https://cuiqingcai.com/5465.html(作者已把书的前几章内容对外公开). 在写爬虫程序之前需要了解的一些知识: 爬虫基础:我们平时访问网页就是对服务器发送请求(Request),然后得到响应(Response)的一个过程.爬虫通过模仿浏览器,对网页进行自动访问.需要知道请求包含哪些内

java网络爬虫基础学习(一)

刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网下载网页,是搜索引擎的重要组成部分. 传统爬虫: 获得URL ->放入队列 ->抓取网页,分析信息 ->新的URL ->放入队列 ->抓取网页,分析信息... ->满足一定条件,停止. 聚焦爬虫: 根据一定的网页分析算法过滤与主题无关的链接

java网络爬虫基础学习(三)

尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=time&page_limit=20&page_start=0 浏览器打开该地址: 发现是这样的 在这里我们需要用java抓取电影的信息,首先要找到资源链接,浏览器右键->检查打开谷歌调试工具 我们可以看到下图 有很多的资源请求,在这里我是一个个搜索,看那个是电影信息的Headers 发

爬虫基础 2.1 http原理

爬虫基础 2.1 http基础原理 写爬虫为啥要了解http的原理? 为了简要的理解http的请求响应过程,便于爬虫的流程的掌握. 2.11 URL和URL ????URI:统一资源标志符号 ????URN: 统一资源名称 命名资源 ????URL:统一资源定位符号 指定资源访问位置 例如网页链接 ? ????资源:指的是网络上所有可以获得的内容的统称 2.12 超文本 ????网页的源代码HTML文件可以看作超文本, 超文本"页面内可以包含图片.链接,甚至音乐.程序等非文字元素 超文本是收集,

爬虫基础之urllib库

categories: 爬虫 tags: urlopen urlretrieve urlencode parse_qs urlparse urlsplit urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据 urlopen函数 在Python3的urllib库中,所有和网络请求相关的方法,都被集到 urllib.request 模块下面了,先来看下urlopen的基本使用 from urllib im

爬虫基础

用java做了一个小爬虫的dome,感觉挺好玩的样子.得好好学学爬虫这门技术 1 java 原生的代码实现爬虫 package wlpz; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; public c

Java版网络爬虫基础(转)

网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广度优先,概括的说来如下: 2个数组,一个记录已访问的网页(Al),一个记录未访问的网页(Un).假设网页A为爬取的起始点,分析A中的所有的超链接B,C,D,将B,C,D加入到Un,分析B中的所有的超链接E,F,将E,F加入到Un末尾,将B从Un除去并加入到AL.依次分析Un中的超链接并加入到Un中就