写在前面



    逆水行舟



 爬虫

     - 基本操作
概要:
- 发送Http请求,Python Http请求,requests
- 提取指定信息,Python 正则表达式,beautifulsoup
- 数据持久化, Python两个模块
- requests
- beautifulsoup Http请求相关知识
- 请求:
请求头
- cookie
请求体
- 发送内容 - 响应:
响应头
- 浏览器读取
响应体
- 看到的内容 特殊:
- cookie
- csrftoken
- content-type: content-type:application/url-form....
name=alex&age=18 content-type:application/json
{name:'alex',age:18}
- 性能相关
- 串行: 1个人,一个任务一个任务,空余时间,玩。
- 线程: 10个人,一个任务一个任务,空余时间,玩。
- 进程: 10个家庭,一个任务一个任务,空余时间,玩。
- 【协程】异步非阻塞:1个人,充分利用时间。 - scrapy框架
- 规则 - redis-scrapy组件 内容详细:
- 基本操作,python伪造浏览器发送请求并或者指定内容 pip3 install requests
response = requests.get('http://www.baidu.com')
response.text pip3 install beautifulsoup4
from bs4 import Beautifulsoup soup = Beautifulsoup(response.text,'html.parser')
soup.find(name='h3',attrs={'class':'t'})
soup.find_all(name='h3') 示例:爬取汽车之家新闻 - 模块 requests
GET:
requests.get(url="http://www.oldboyedu.com")
# data="http GET / http1.1\r\nhost:oldboyedu.com\r\n....\r\n\r\n" requests.get(url="http://www.oldboyedu.com/index.html?p=1")
# data="http GET /index.html?p=1 http1.1\r\nhost:oldboyedu.com\r\n....\r\n\r\n" requests.get(url="http://www.oldboyedu.com/index.html",params={'p':1})
# data="http GET /index.html?p=1 http1.1\r\nhost:oldboyedu.com\r\n....\r\n\r\n" POST:
requests.post(url="http://www.oldboyedu.com",data={'name':'alex','age':18}) # 默认请求头:url-formend....
data="http POST / http1.1\r\nhost:oldboyedu.com\r\n....\r\n\r\nname=alex&age=18" requests.post(url="http://www.oldboyedu.com",json={'name':'alex','age':18}) # 默认请求头:application/json
data="http POST / http1.1\r\nhost:oldboyedu.com\r\n....\r\n\r\n{"name": "alex", "age": 18}" requests.post(
url="http://www.oldboyedu.com",
params={'p':1},
json={'name':'alex','age':18}
) # 默认请求头:application/json data="http POST /?p=1 http1.1\r\nhost:oldboyedu.com\r\n....\r\n\r\n{"name": "alex", "age": 18}" 补充:
request.body,永远有值
request.POST,可能没有值 beautifulsoup
soup = beautifulsoup('HTML格式字符串','html.parser') tag = soup.find(name='div',attrs={})
tags = soup.find_all(name='div',attrs={}) tag.find('h3').text
tag.find('h3').get('属性名称')
tag.find('h3').attrs HTTP请求:
GET请求:
data="http GET /index?page=1 http1.1\r\nhost:baidu.com\r\n....\r\n\r\n" POST请求:
data="http POST /index?page=1 http1.1\r\nhost:baidu.com\r\n....\r\n\r\nname=alex&age=18" socket.sendall(data) 示例【github和抽屉】:任何一个不用验证码的网站,通过代码自动登录 1. 按理说
r1 = requests.get(url='https://github.com/login')
s1 = beautifulsoup(r1.text,'html.parser')
val = s1.find(attrs={'name':'authenticity_token'}).get('value') r2 = requests.post(
url= 'https://github.com/session',
data={
'commit': 'Sign in',
'utf8': '✓',
'authenticity_token': val,
'login':'xxxxx',
'password': 'xxxx', }
) r2_cookie_dict = r2.cookies.get_dict() # {'session_id':'asdfasdfksdfoiuljksdf'} 保存登录状态,查看任意URL r3 = requests.get(
url='xxxxxxxx',
cookies=r2_cookie_dict
) print(r3.text) # 登录成功之后,可以查看的页面 2. 不按理说
r1 = requests.get(url='https://github.com/login')
s1 = beautifulsoup(r1.text,'html.parser')
val = s1.find(attrs={'name':'authenticity_token'}).get('value')
# cookie返回给你
r1_cookie_dict = r1.cookies.get_dict() r2 = requests.post(
url= 'https://github.com/session',
data={
'commit': 'Sign in',
'utf8': '✓',
'authenticity_token': val,
'login':'xxxxx',
'password': 'xxxx', },
cookies=r1_cookie_dict
)
# 授权
r2_cookie_dict = r2.cookies.get_dict() # {} 保存登录状态,查看任意URL r3 = requests.get(
url='xxxxxxxx',
cookies=r1_cookie_dict
) print(r3.text) # 登录成功之后,可以查看的页面 - requests
"""
1. method
2. url
3. params
4. data
5. json
6. headers
7. cookies
8. files
9. auth
10. timeout
11. allow_redirects
12. proxies
13. stream
14. cert
================ session,保存请求相关信息(不推荐)===================
import requests session = requests.Session() i1 = session.get(url="http://dig.chouti.com/help/service")
i2 = session.post(
url="http://dig.chouti.com/login",
data={
'phone': "8615131255089",
'password': "xxooxxoo",
'oneMonth': ""
}
)
i3 = session.post(
url="http://dig.chouti.com/link/vote?linksId=8589523"
)
print(i3.text) """
- beautifulsoup
- find()
- find_all()
- get()
- attrs
- text 内容:
1. 示例:汽车之家
2. 示例:github和chouti
3. requests和beautifulsoup
4. 轮询和长轮询
5. Django
request.POST
request.body # content-type:xxxx 作业:web微信
功能:
1. 二维码显示
2. 长轮询:check_login
3.
- 检测是否已经扫码
- 扫码之后201,头像: base64:.....
- 点击确认200,response.text redirect_ur=....
4. 可选,获取最近联系人信息 安装:
twsited
scrapy框架

武Sir - 笔记

参考:http://www.cnblogs.com/wupeiqi/articles/6283017.html

爬虫相关
- 基本操作
- 概要
- 发送http请求 requests模块
- 提取指定信息 正则 Beautifulsoup模块
- 数据持久化 - Python的2个模块
- requests
- Beautifulsoup - Http请求相关知识
- 请求
- 请求头
- cookie
- 请求体
- 发送的内容
- 响应
- 响应头
- 浏览器读取
- 响应体
- 看到的内容 - 特殊
- cookie
- csrf_token
- content-type 用来指定客户端按照哪种格式进行解析 - 性能相关
- 进程
- 线程
- 协程 - 【协程】异步非阻塞:充分利用系统资源 - scrapy框架
- 学习scrapy的规则 - redis&scrapy组件:完成一个简单的分布式爬虫 内容详细
- 基本操作 Python伪造浏览器发送请求 pip3 install requests
pip3 install Beautifulsoup4 import requests
from bs4 import BeautifulSoup response = requests.get("http://www.baidu.com")
response.text -> 网页内容 soup = Beautifulsoup(response.text,'html.parse') # 从上到下第一个 <h3 class='t'> 标签
soup.find(name='h3',attrs={'class':'t'})
# 查找全部 <h3>标签
soup.find_all(name='h3') ... 模块
requests
response = requests.get(url='url路径')
# 解决乱码问题
response.encoding = response.apparent_encoding GET请求:
requests.get(url='www.baidu.com')
data = "http GET / ...."
requests.get(url='www.baidu.com?page=1')
data = "http GET page=1 ...."
requests.get(url='www.baidu.com',params={'page':1}) POST请求:
requests.post(url='www.baidu.com',data={'name':'alex','age':18}) # 默认携带请求头类型:application/x-www-form-urlencoded requests.post(url='www.baidu.com',json={'name':'alex','age':18}) # 默认携带请求头类型:application/json # POST请求既可以在请求体里传参,又可以在url里传参
requests.post(url='www.baidu.com',params={'page':1},json={'name':'alex','age':18}) 补充:
django里的 request.POST 里的值是django根据请求体里的数据转换过来的
所以,如果body里的数据格式不对,那么就转换不了,导致request.POST里面没有值
django里的 request.body 里永远有值
django里的 request.POST 可能没有值 BeautifulSoup
soup = BeautifulSoup('html格式字符串','html.parser')
tag = soup.find(name='div',attrs={...})
tag = soup.find_all(name='div',attrs={...}) tag.find('h3').text
tag.find('h3').content
tag.find('h3').get('属性名称')
tag.find('h3').attrs['属性名称'] 服务器端不能主动给客户端发消息
但是websocket可以 - 【轮询】 http协议,客户端轮询(每秒1次)请求服务端;一次请求,服务端收到后不管有没有新消息都立即返回
- 【长轮询】 http协议,客户端发来请求,服务器把客户端给hang住,直到服务端收到新消息并发送给所有客户端、才断开连接;
客户端收到消息后,再立即发请求到服务端进行下一次hang住。
hang住,有一个超时时间,web微信超时时间是25s
应用:web微信
- 【WebSocket】 不是http协议,建立在tcp之上
一次连接不断开,双工通道,可以互相发送消息
但是浏览器兼容性不太好,以后将会应用的更广泛 浏览器有同源策略
ajax发送跨域请求是接收不到结果的 http://www.cnblogs.com/wupeiqi/articles/6283017.html #!/usr/bin/python
# -*- coding:utf-8 -*- import requests requests.request() requests.get(url='xxx')
# 本质上就是:
requests.request(method='get',url='xxx') import json
requests.post(url='xxx',data={'name':'alex','age':18}) # content_type: application/x-www-form-urlencoded
requests.post(url='xxx',data="name=alex&age=18") # content_type: application/x-www-form-urlencoded
# 不伦不类
requests.post(url='xxx',data=json.dumps({'name':'alex','age':18})) # content_type: application/x-www-form-urlencoded
# 利用headers参数重写 Content_type
requests.post(url='xxx',data=json.dumps({'name':'alex','age':18}),headers={'Content_type':'application/json'}) # content_type: application/x-www-form-urlencoded
requests.post(url='xxx',json={'name':'alex','age':18}) # content_type: application/json """
1.method
2.url
3.params
4.data
5.json
6.headers
7.cookies 8.files
9.auth
10.timeout
11.allow_redirects
12.proxies
13.stream
14.cert =================== session,保存请求相关信息 ==================
session = requests.Session()
session.get(url='xxx')
session.post(...)
""" """
8.files 用作文件上传
"""
file_dict = {
'f1': open('readme', 'rb')
}
requests.post(url='xxx',file=file_dict)
# 发送文件,定制文件名
# file_dict = {
# 'f1': ('test.txt', open('readme', 'rb'))
# }
# requests.request(method='POST',
# url='http://127.0.0.1:8000/test/',
# files=file_dict) # 发送文件,定制文件名
# file_dict = {
# 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf")
# }
# requests.request(method='POST',
# url='http://127.0.0.1:8000/test/',
# files=file_dict) """
9.auth 基本认证 路由器登录
"""
from requests.auth import HTTPBasicAuth,HTTPDigestAuth requests.get('https://api.github.com/user',auth=HTTPBasicAuth('gypsying','password')) """
timeout (连接超时,响应超时)
"""
requests.get('http://google.com',timeout=3)
requests.get('http://google.com',timeout=(5,1)) """
allow_redirects
""" """
proxies 应对IP被封的情况
"""
proxyDict = {
"http": "61.172.249.96:80",
"https": "http://61.185.219.126:3128",
}
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'} """
stream
"""
from contextlib import closing
with closing(requests.get('xxx',stream=True)) as f:
for i in f.iter_content():
print(i) requests.put()
requests.delete() BeautifulSoup
- find()
- find_all()
- get()
- attrs
- text soup = BeautifulSoup('html格式字符串','html.parser')
soup = BeautifulSoup('html格式字符串',features='lxml') 第三方,需额外安装,但是速度比'html.parser'更快 soup = BeautifulSoup('html格式字符串','html.parser')
tag = soup.find(attrs={'class':'c1'})
tag.name -> 标签名字 tag = soup.find(attrs={'class':'c1'})
等价于:
tag = soup.find(class_='c1') print(tag.attrs) tag.attrs['id'] = 1
del tag.attrs['class']
# attrs 进行增删改查都可以 tag.children 所有孩子
tag.descendants 所有后代
tag.find_all() 包含的所有标签,并且递归了
tag.find_all(recursive=False) 包含的所有标签,不递归 tag.clear() 清空内部元素,保留自己
tag.decompose() 递归删除所有标签,包含自己
res = tag.extract() 相当于字典的pop,其余同decompose() tag = soup.find(class_='c1') # 对象
tag.decode() # 对象变成字符串
tag.encode() # 对象变成字节 tag.find('a')
# tag = soup.find('a')
# print(tag)
# tag = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
# tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
# print(tag) find_all()
# tags = soup.find_all('a')
# print(tags) # tags = soup.find_all('a',limit=1)
# print(tags) # tags = soup.find_all(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
# # tags = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
# print(tags) # ####### 列表 #######
# v = soup.find_all(name=['a','div'])
# print(v) # v = soup.find_all(class_=['sister0', 'sister'])
# print(v) # v = soup.find_all(text=['Tillie'])
# print(v, type(v[0])) # v = soup.find_all(id=['link1','link2'])
# print(v) # v = soup.find_all(href=['link1','link2'])
# print(v) # ####### 正则 #######
import re
# rep = re.compile('p')
# rep = re.compile('^p')
# v = soup.find_all(name=rep)
# print(v) # rep = re.compile('sister.*')
# v = soup.find_all(class_=rep)
# print(v) # rep = re.compile('http://www.oldboy.com/static/.*')
# v = soup.find_all(href=rep)
# print(v) # ####### 方法筛选 #######
# def func(tag):
# return tag.has_attr('class') and tag.has_attr('id')
# v = soup.find_all(name=func)
# print(v) # ## get,获取标签属性
# tag = soup.find('a')
# v = tag.get('id')
# print(v) from bs4.element import Tag tag.has_attr()
tag.text 等价于 tag.get_text() v = tag.index(tag.find('div')) tag.text
tag.string 也可以获取内容,并扩展了修改内容
tag.string = "xxxx"
tag.stripped_strings 相当于join给分割成了list
tag.children
for item in tag.children:
print(item,type(item)) from bs4.element import Tag
tag= Tag(name='i',attrs={'id':'it'})
tag.string = "asasasasasasazxzxzx" soup.find(id='xxx').append(tag) """ 扩展copy模块 """
import copy
copy.deepcopy()
... tag.wrap(tag1)
tag.unwrap() ++++++++++++++++++++++++++++++++++++ 内容梳理:
- 汽车之间新闻爬取示例
- github和抽屉自动登录 以及 登陆后的操作
- requests 和 Beautifulsoup 基本使用
- 轮训和长轮询
- Django 里 content-type问题
request.POST
request.body 练习:web微信
1. 二维码显示
2. 长轮询 check_login() :ajax递归 (js递归没有层数限制)
3. 检测是否已经扫码
- 扫码之后201:替换头像 base64:...
src="img_path"
或者
src="base64:xxxxxxxx...."
- 扫码之后继续轮训,等待用户点击确认
- 点击确认之后,返回200
response.text redirect_url-....
- 获取最近联系人信息 下节课前安装
twsited
scrapy框架

  

服务器端不能主动给客户端发消息
但是websocket可以 - 【轮询】 http协议,客户端轮询(每秒1次)请求服务端;一次请求,服务端收到后不管有没有新消息都立即返回
- 【长轮询】 http协议,客户端发来请求,服务器把客户端给hang住,直到服务端收到新消息并发送给所有客户端、才断开连接;
客户端收到消息后,再立即发请求到服务端进行下一次hang住。
hang住,有一个超时时间,web微信超时时间是25s
应用:web微信
- 【WebSocket】 不是http协议,建立在tcp之上
一次连接不断开,双工通道,可以互相发送消息
但是浏览器兼容性不太好,以后将会应用的更广泛

一、爬虫几点基础知识

- 基本操作
- 概要
- 发送http请求 requests模块
- 提取指定信息 正则 Beautifulsoup模块
- 数据持久化 - Python的2个模块
- requests
- Beautifulsoup - Http请求相关知识
- 请求
- 请求头
- cookie
- 请求体
- 发送的内容
- 响应
- 响应头
- 浏览器读取
- 响应体
- 看到的内容 - 特殊
- cookie
- csrf_token
- content-type 用来指定客户端按照哪种格式进行解析 - 性能相关
- 进程
- 线程
- 协程 - 【协程】异步非阻塞:充分利用系统资源 - scrapy框架
- 学习scrapy的规则 - redis&scrapy组件:完成一个简单的分布式爬虫

  

二、爬取汽车之家新闻示例

#!/usr/bin/python
# -*- coding:utf-8 -*- """
爬取汽车之家的新闻
"""
import os
import requests
from bs4 import BeautifulSoup response = requests.get('http://www.autohome.com.cn/news/')
""" 指定编码,否则会乱码 """
# print(response.apparent_encoding)
# print(response.encoding)
""" Good """
response.encoding = response.apparent_encoding
# print(response.encoding)
# print(type(response.text)) # <class 'str'>
# print(type(response.content)) # <class 'bytes'> """ BeautifulSoup把各种HTML标签转换成各种对象,所以可以使用 obj.attr 方式 """
soup = BeautifulSoup(response.text,'html.parser')
tag = soup.find(name='div',attrs={'id':'auto-channel-lazyload-article'}) li_list = tag.find_all('li') # [标签对象,标签对象,标签对象...]
for li in li_list:
h3 = li.find(name='h3')
if not h3:
continue
else:
print(h3.text)
# 获取属性
print(li.find(name='a').get('href'))
# 或者:print(li.find(name='a').attrs['href'])
print(li.find('p').text) # 下载图片
img_url = li.find('img').get('src')
print(img_url)
res = requests.get('http:'+img_url)
img_path = os.path.join('autohome',img_url.split('/')[-1])
with open(img_path,'wb') as fw:
fw.write(res.content)

  

一抹红的专属感 Macan Turbo特别版官图
//www.autohome.com.cn/news/201710/908351.html#pvareaid=102624
[汽车之家 新车官图] 日前,保时捷发布了Macan Turbo Exclusive Performance Edition的官图,作为一款特别版车...
//www3.autoimg.cn/newsdfs/g10/M0F/B2/EA/120x90_0_autohomecar__wKgH0VnqsC6AYGDFAAGFLm8dSfc007.jpg
还要怎么轻? 路特斯Elise Cup 260官图
//www.autohome.com.cn/news/201710/908350.html#pvareaid=102624
[汽车之家 新车官图] 日前,路特斯官方宣布推出Elise Cup 260,这款车相比于已经进行进一步轻量化改造的新款Cup 250要更轻更快,全球...
//www3.autoimg.cn/newsdfs/g18/M0C/B9/7A/120x90_0_autohomecar__wKgH6FnqrhyAH3UDAAFOwoge9w4751.jpg
...

  

三、自动登录网站示例

参考:http://www.cnblogs.com/wupeiqi/articles/6283017.html

  - .2种网站授权登录的方式

requests.get()  +  requests.post()

    - 方式1

    1.第一次GET请求获取token

    2.第二次POST请求进行验证并获取cookie

    3.第三次GET/POST请求并携带cookie实现用户登录后的某些操作

    - 方式2

    1.第一次GET请求获取token和未被授权的cookie

    2.第二次POST请求并携带cookie进行验证并授权

    3.第三次GET/POST请求并携带授权过的cookie实现用户登录后的某些操作

另外可以使用 requests.session()  更简单的实现:

session = requests.Session()

session.get()  + session.post()

  

  - .自动登录Github并浏览个人主页

#!/usr/bin/python
# -*- coding:utf-8 -*- import requests
from bs4 import BeautifulSoup """
第二种Python登录的cookie携带方式
以登录 github账户为例:
- 第一次去请求 https://github.com/login 这个页面的时候,服务端就给返回了cookie
- 第二次去请求 https://github.com/session 进行提交用户名密码的时候,要带上上一次返回的cookie进行授权
- 第三次去请求用户登录后才能看到的页面(例如个人主页),需要带上上面授权好的cookie,才可以
""" """ 1.获取token和cookie """
rsp1 = requests.get(url='https://github.com/login')
soup1 = BeautifulSoup(rsp1.text,'html.parser')
# 根据属性值找到对应标签,进而获取其value值
token = soup1.find(attrs={'name':'authenticity_token'}).get('value')
# 获取第一次请求获得的cookie
rsp1_cookie_dict = rsp1.cookies.get_dict()
print(token)
print(rsp1_cookie_dict) """ 2.发起登录POST请求 """
rsp2 = requests.post(
url='https://github.com/session',
data={
'commit':'Sign in',
'utf8':'✓',
'authenticity_token':token,
'login':'gypsying',
'password':'xxxxxxxxx',
},
cookies=rsp1_cookie_dict
)
# 获取第二次请求获得的cookie
rsp2_cookie_dict = rsp2.cookies.get_dict()
print(rsp2_cookie_dict) all_cookie_dict = {}
all_cookie_dict.update(rsp1_cookie_dict)
all_cookie_dict.update(rsp2_cookie_dict) print(all_cookie_dict) """ 3.发起查看个人主页的GET请求 """
rsp3 = requests.get(
url='https://github.com/Gypsying',
cookies=all_cookie_dict
) soup3 = BeautifulSoup(rsp3.text,'html.parser')
email = soup3.find(name='a',attrs={'class':'u-email'}).text
print(email) # 就可以拿到了 hitwh_Gypsy@163.com

  

  - .自动登录抽屉并实施点赞操作

import requests
from bs4 import BeautifulSoup index_url = "http://dig.chouti.com/"
rsp1 = requests.get(index_url) soup = BeautifulSoup(rsp1.text,'html.parser')
a_list = soup.find_all(attrs={'class':'digg-a'})
id_list = []
# 获取首页上所有新闻的id
for item in a_list:
news_id = item.find(name='i').text
id_list.append(news_id) # 获得GET首页时候返回的 cookie ,此时的cookie是没有授权的
index_cookie = rsp1.cookies.get_dict()
login_url = "http://dig.chouti.com/login"
data = {
'phone':8600000000000,
'password':'xxxxxx',
'oneMonth':1
}
# 提交用户名和密码,并带上未授权的cookie进行授权
login_ret = requests.post(url=login_url,data=data,cookies=index_cookie)
login_cookie = login_ret.cookies.get_dict()
login_ret = eval(login_ret.text)
code = login_ret.get('result').get('code')
if "9999" == code:
print("登录成功")
else:
print("登录失败")
"""
{"result":{"code":"8887", "message":"手机号格式不对", "data":""}}
{"result":{"code":"21100", "message":"该手机号未注册", "data":""}}
{"result":{"code":"29998", "message":"手机号或密码错误", "data":{}}} {"result":{"code":"9999", "message":"", "data":{"complateReg":"0","destJid":"cdu_50613120077"}}}
""" # 点赞的时候需要带上上次授权好的cookie
for news_id in id_list:
like_url = "http://dig.chouti.com/link/vote?linksId={}".format(news_id)
like_ret = requests.post(url=like_url,cookies=index_cookie)
print(like_ret.text) """
{"result":{"code":"30010", "message":"您已经推荐过了", "data":""}}
{"result":{"code":"9999", "message":"推荐成功", "data":{"jid":"cdu_50613120077","likedTime":"1509378903908000","lvCount":"8","nick":"gypsy","uvCount":"1","voteTime":"小于1分钟前"}}}
"""

  

四、模拟Web版微信相关操作

"""
微信网页版登录示例 GET https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1508052025433
得到响应: window.QRLogin.code = 200; window.QRLogin.uuid = "IapQqsoqcA=="; 二维码src https://login.weixin.qq.com/qrcode/IapQqsoqcA== 长轮询: https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=IapQqsoqcA==&tip=0&r=-518626217&_=1508052025438
"""

爬虫基础01-day23的更多相关文章

  1. 【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

    [爬虫入门01]我第一只由Reuests和BeautifulSoup4供养的Spider 广东职业技术学院  欧浩源 1.引言  网络爬虫可以完成传统搜索引擎不能做的事情,利用爬虫程序在网络上取得数据 ...

  2. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

  3. 爬虫基础02-day24

    写在前面 上课第24天,打卡: 努力不必让全世界知道: s16/17爬虫2 内容回顾: 1. Http协议 Http协议:GET / http1.1/r/n...../r/r/r/na=1 TCP协议 ...

  4. python基础整理6——爬虫基础知识点

    爬虫基础 什么是爬虫: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁. ...

  5. 【Nodejs】理想论坛帖子爬虫1.01

    用Nodejs把Python实现过的理想论坛爬虫又实现了一遍,但是怎么判断所有回调函数都结束没有好办法,目前的spiderCount==spiderFinished判断法在多页情况下还是会提前中止. ...

  6. 【网络爬虫入门01】应用Requests和BeautifulSoup联手打造的第一条网络爬虫

    [网络爬虫入门01]应用Requests和BeautifulSoup联手打造的第一条网络爬虫 广东职业技术学院 欧浩源 2017-10-14  1.引言 在数据量爆发式增长的大数据时代,网络与用户的沟 ...

  7. python爬虫基础要学什么,有哪些适合新手的书籍与教程?

    一,爬虫基础: 首先我们应该了解爬虫是个什么东西,而不是直接去学习带有代码的内容,新手小白应该花一个小时去了解爬虫是什么,再去学习带有代码的知识,这样所带来的收获是一定比你直接去学习代码内容要多很多很 ...

  8. javascript基础01

    javascript基础01 Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有 ...

  9. Androd核心基础01

    Androd核心基础01包含的主要内容如下 Android版本简介 Android体系结构 JVM和DVM的区别 常见adb命令操作 Android工程目录结构 点击事件的四种形式 电话拨号器Demo ...

  10. java基础学习05(面向对象基础01)

    面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...

随机推荐

  1. python3基础概念

    数: str:使用单引号或双引号表达,不可变的,一旦创建不可更改,可以使变量赋予不同的字符串,但字符串本身是没有更改的: list:有序的集合,可变的基础数据类型: clear(),copy(),ap ...

  2. 利用saltstack批量安装clamav杀毒软件

    源码包安装: clamav_source: file.managed: - name: /tmp/clamav-0.99.2.tar.gz - unless: test -f /tmp/clamav- ...

  3. 【Luogu3602】Koishi Loves Segments(贪心)

    [Luogu3602]Koishi Loves Segments(贪心) 题面 洛谷 题解 离散区间之后把所有的线段挂在左端点上,从左往右扫一遍. 对于当前点的限制如果不满足显然会删掉右端点最靠右的那 ...

  4. 计算机网络实验八实验报告——应用Packet Tracer 5.0模拟器工具对WLAN进行配置

    计算机网络实验八实验报告 一.实验目的 1.熟练使用Packet Tracer 5.0模拟器: 2.应用Packet Tracer 5.0模拟器工具对WLAN进行配置. 二.实验环境 一台PC机. 模 ...

  5. NOIP2018凉凉记

    首先声明一下,我去不了TG,因为我太菜了GD的某教授把我打到PJ了…… 虽然就我这实力普及都不一定1= 不管了,这次是普及,就当扎实基础了.反正HF的 $\text{hhz}$ 也考PJ,见个面多好啊 ...

  6. zxing二维码的生成与解码(C#)

    ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和An ...

  7. bash 2

    除了显式地直接赋值,还可以用语句给变量赋值,如 for file in `ls /etc` 或 for file in $(ls /etc) your_name="qinjx" e ...

  8. hdu 2159FATE(完全背包)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 思路一:完全背包转“01”背包 考虑到第ki个怪最多杀min(m/b[ki],s ...

  9. 解决jQuery ajax动态新增节点无法触发点击事件的问题

    在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件.为什么点击事件失效,我们该怎么去解决呢? 其实最简单的方法就是直接在标签中写onclick="" ...

  10. socket编程 ------ UDP服务器

    void vLANcommunication( void *pvParameters ) { int32 listenfd; do{ listenfd = socket(AF_INET, SOCK_D ...