forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstagram_crawler.py
More file actions
Latest commit
140 lines (111 loc) · 4.04 KB
/
Copy pathinstagram_crawler.py
File metadata and controls
140 lines (111 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env python3
from __future__ importannotations
importjson
importrequests
frombs4importBeautifulSoup
fromfake_useragentimportUserAgent
headers= {"UserAgent": UserAgent().random}
defextract_user_profile(script) ->dict:
"""
May raise json.decoder.JSONDecodeError
"""
data=script.contents[0]
info=json.loads(data[data.find('{"config"') : -1])
returninfo["entry_data"]["ProfilePage"][0]["graphql"]["user"]
classInstagramUser:
"""
Class Instagram crawl instagram user information
Usage: (doctest failing on GitHub Actions)
# >>> instagram_user = InstagramUser("github")
# >>> instagram_user.is_verified
True
# >>> instagram_user.biography
'Built for developers.'
"""
def__init__(self, username):
self.url=f"https://www.instagram.com/{username}/"
self.user_data=self.get_json()
defget_json(self) ->dict:
"""
Return a dict of user information
"""
html=requests.get(self.url, headers=headers).text
scripts=BeautifulSoup(html, "html.parser").find_all("script")
try:
returnextract_user_profile(scripts[4])
except (json.decoder.JSONDecodeError, KeyError):
returnextract_user_profile(scripts[3])
def__repr__(self) ->str:
returnf"{self.__class__.__name__}('{self.username}')"
def__str__(self) ->str:
returnf"{self.fullname} ({self.username}) is {self.biography}"
@property
defusername(self) ->str:
returnself.user_data["username"]
@property
deffullname(self) ->str:
returnself.user_data["full_name"]
@property
defbiography(self) ->str:
returnself.user_data["biography"]
@property
defemail(self) ->str:
returnself.user_data["business_email"]
@property
defwebsite(self) ->str:
returnself.user_data["external_url"]
@property
defnumber_of_followers(self) ->int:
returnself.user_data["edge_followed_by"]["count"]
@property
defnumber_of_followings(self) ->int:
returnself.user_data["edge_follow"]["count"]
@property
defnumber_of_posts(self) ->int:
returnself.user_data["edge_owner_to_timeline_media"]["count"]
@property
defprofile_picture_url(self) ->str:
returnself.user_data["profile_pic_url_hd"]
@property
defis_verified(self) ->bool:
returnself.user_data["is_verified"]
@property
defis_private(self) ->bool:
returnself.user_data["is_private"]
deftest_instagram_user(username: str="github") ->None:
"""
A self running doctest
>>> test_instagram_user()
"""
importos
ifos.environ.get("CI"):
return# test failing on GitHub Actions
instagram_user=InstagramUser(username)
assertinstagram_user.user_data
assertisinstance(instagram_user.user_data, dict)
assertinstagram_user.username==username
ifusername!="github":
return
assertinstagram_user.fullname=="GitHub"
assertinstagram_user.biography=="Built for developers."
assertinstagram_user.number_of_posts>150
assertinstagram_user.number_of_followers>120000
assertinstagram_user.number_of_followings>15
assertinstagram_user.email=="support@github.com"
assertinstagram_user.website=="https://github.com/readme"
assertinstagram_user.profile_picture_url.startswith("https://instagram.")
assertinstagram_user.is_verifiedisTrue
assertinstagram_user.is_privateisFalse
if__name__=="__main__":
importdoctest
doctest.testmod()
instagram_user=InstagramUser("github")
print(instagram_user)
print(f"{instagram_user.number_of_posts=}")
print(f"{instagram_user.number_of_followers=}")
print(f"{instagram_user.number_of_followings=}")
print(f"{instagram_user.email=}")
print(f"{instagram_user.website=}")
print(f"{instagram_user.profile_picture_url=}")
print(f"{instagram_user.is_verified=}")
print(f"{instagram_user.is_private=}")