爬虫(只使用请求,响应进行爬取)
方法1
import requests
responses = requests.get(url,headers=head)
方法2
from urllib import request
head = request.Request(url, headers=headers, method='POST ')
# response响应对象
response = request.urlopen(head)
Scrapy框架
scrapy engine :负责Spider、item pipline、scheduler、download之间的通讯,信号、数据的传递
Schedule:负责接收engine发过来的request请求,并按照一定的方式进行整理排入队列,当engine需要时,交还给engine
Downloader:下载engine发送的所有requests请求,并将其获得的responses交还给engine,由engine交还给Spider进行处理
Spider:处理所有responses,从中分析提取数据,获取item字段需要的数据,并将需要跟进的url交给engine,再次送给schedule进行处理
Item pipline:处理Spider获取的item,进行后期处理(分析、存储、过滤)
Downloader Middlewares:自定义扩展下载功能组件
Spider Middlewares:engine和Spider之间通信功能组件(设置进入Spider的responses和出去的requests)
Xpath
/从当前节点选取直接子节点
//从当前节点选取子孙节点
.选取当前节点
..当前节点父节点
@属性
多值匹配
text = '''<li class="li li-first"><a href="link.html">first item</a></li>'''
result =html.xpath('//li[contains(@class,"li")]/a/text()')
# 运行结果:['first item']
多属性匹配
text = '''<li class="li li-first" name="item"><a href="link.html">first item</a></li>'''
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
# 获取第一个
result = html.xpath('//li[1]/a/text()')
print(result)
# 获取最后一个
result = html.xpath('//li[last()]/a/text()')
print(result)
# 获取前两个
result = html.xpath('//li[position()<3]/a/text()')
print(result)
# 获取倒数第三个
result = html.xpath('//li[last()-2]/a/text()')
正则表达式re
1、尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(正则,字符串,标志位) 标志位:re.I 不区分大小写
re.M多行匹配,影响^ $
re.S使. 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
2、group()与正则表达式中()一起使用
matchObj= re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
matchObj.group(1)
matchObj.group(2)
3、扫描整个字符串并返回第一个成功的匹配。
re.search(pattern, string, flags=0)
4、替换字符串中的匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
5、编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
m = pattern.match('one12twothree34four') # 查找头部,没有匹配
6、在字符串中找到正则表达式所匹配的所有子串
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('runoob 123 google 456')
re.findall('\d+', 'runoob 123 google 456')
7、split 方法按照能够匹配的子串将字符串分割后返回列表
re.split(pattern, string[, maxsplit=0,flags=0])
注意和split()函数相区分,功能一样,如Str.split(“,”)
8、'(?P...)' 分组匹配
s ='1102231990xxxxxxxx'
res =re.search('(?P<province>\d{3})(?P\d{3})(?P\d{4})',s)
{'province':'110', 'city': '223', 'born_year': '1990'}
转义字符
\d 匹配的内容是一串数字
\D 匹配的内容是一串非数字
\s 匹配任意空白字符,等价于 [\t\n\r\f]。
\S 匹配任意非空字符
\w 匹配数字字母下划线
\W 匹配非数字字母下划线
{m,n} 匹配m到n-1个字符
CSS提取数据
id=intro的元素 #intro,可以结合元素选择器,比如p#intro
class=important的元素 .important,可以结合元素选择器,比如p.important
<a href = “http://www.ddfdfdfdf.com”> a[href]选择所有带有href属性的锚元素
[href^=”http”] href属性值是http开头
[href*=”http”] href属性值包含http
[href$=”http”] href属性值是http 结尾
#link1 + .sister选择id=link1后下一个class=sister兄弟节点标签
#link1 ~ .sister选择id=link1后所有class=sister兄弟节点标签
h1 > strong strong是h1的子标签
h1 strong h1下的所有strong标签
BeautifulSoup
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html'), "html.parser")
书写格式:
soup.select('a[href*=".com"]')
SQL语句
1、子查询
SELECT * FROM Person
WHERE exists
(
SELECT * FROM Person
WHERE Person_Id = 100 如果不存在Person_Id的记录,则子查询没有结果集返回,主语句不执行
)
或者
select a,b,c from a where a IN (select dfrom b )
2、创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
3、查找
select * from table1 where field1like’%value1%’
4、排序
select * from table1 order by field1,field2 [desc]
5、总数
select count as totalcount from table1
6、求和
select sum(field1) as sumvalue from table1
7、平均
select avg(field1) as avgvalue from table1
8、最大
select max(field1) as maxvalue from table1
9、最小
select min(field1) as minvalue from table1
10、更新
UPDATE 表名称SET 列名称 = 新值 WHERE 列名称 = 某值
11、插入
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
Selenium 模拟浏览器
from selenium import webdriver
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://morvanzhou.github.io/")
driver.find_element_by_xpath(u"//img[@alt='强化学习(ReinforcementLearning)']").click()
driver .find_element_by_xpath('//*[@id="XXX"]').send_keys("123456")
driver.find_element_by_link_text("About").click()
多线程
import threading
#设置并开启线程A
class Thread_A(threading.Thread):
#设置初始化方法(init)和线程需要执行什么操作的方法(run)
#初始化线程
def __init__(self):
threading.Thread.__init__(self)
#执行操作
def run(self) :
for j in range(1, 20):
print("AAA")
class Thread_B(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self) :
for j in range(1,20):
print("BBB")
if __name__ == '__main__':
t1=Thread_A()
t1.start()
t2=Thread_B()
t2.start()